Динамичният 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';