Dynamisk SQL fungerar inte så.
Du kan fortfarande inte skicka parametrar till en dynamisk sträng som kommer att användas i stället för objektnamn.
Du måste konstruera frågesträngen själv, manuellt ersätta @DBName
med verkligt värde. Du kan dock använda en parameter på höger sida av en ekvation, utan citattecken.
När du lägger in ett objektnamn i en fråga ska du alltid använda QUOTENAME fungera. Det kommer att undvika namnet korrekt så att det inte finns någon sql-injektion eller oönskat beteende som orsakas av vissa tecken i ett objekts namn.
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';