SQL dinámico no funciona así.
Todavía no puede pasar parámetros a una cadena dinámica que se usará en lugar de nombres de objetos.
Debe construir la cadena de consulta usted mismo, reemplazando manualmente @DBName
con valor real. Sin embargo, puede usar un parámetro en el lado derecho de una ecuación, sin comillas.
Además, al poner un nombre de objeto en una consulta, utilice siempre el QUOTENAME
función. Escapará correctamente del nombre para que no haya inyección de sql o comportamiento no deseado causado por ciertos caracteres en el nombre de un 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';