SQL dinâmico não funciona assim.
Você ainda não pode passar parâmetros para uma string dinâmica que será usada no lugar de nomes de objetos.
Você mesmo deve construir a string de consulta, substituindo manualmente
@DBName
com valor real. No entanto, você pode usar um parâmetro no lado direito de uma equação, sem aspas. Além disso, ao colocar um nome de objeto em uma consulta, sempre use o
QUOTENAME
função. Ele escapará corretamente do nome para que não haja injeção de sql ou comportamento indesejado causado por determinados caracteres no nome de um objeto. 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';