Динамический SQL не работает таким образом.
Вы по-прежнему не можете передавать параметры в динамическую строку, которая будет использоваться вместо имен объектов.
Вы должны создать строку запроса самостоятельно, заменив вручную@DBName
с фактическим значением.Однако вы можете использовать параметр в правой части уравнения без кавычек.
Кроме того, при вводе имени объекта в запрос всегда используйте функцию QUOTENAME
.Он будет правильно экранировать имя, поэтому в нем не будет SQL-инъекций или нежелательного поведения, вызванного определенными символами в имени объекта.
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';