Le SQL dynamique ne fonctionne pas comme ça.
Vous ne pouvez toujours pas passer de paramètres à une chaîne dynamique qui sera utilisée à la place des noms d'objets.
Vous devez construire vous-même la chaîne de requête, en remplaçant manuellement @DBName
avec la valeur réelle. Cependant, vous pouvez utiliser un paramètre sur le côté droit d'une équation, sans guillemets.
De même, lorsque vous insérez un nom d'objet dans une requête, utilisez toujours le QUOTENAME
fonction. Il échappera correctement le nom afin qu'il n'y ait pas d'injection sql ou de comportement indésirable causé par certains caractères dans le nom d'un objet.
SET @sql = N' IF EXISTS (SELECT NAME FROM master.sys.databases sd where name = @DBName)
BEGIN
ALTER DATABASE ' + quotename(@DBName, '[') + N' SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE ' + quotename(@DBName, '[') + N' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE ' + quotename(@DBName, '[') + N'
END';