Dynamisk SQL fungerer ikke sådan.
Du kan stadig ikke sende parametre til en dynamisk streng, der vil blive brugt i stedet for objektnavne.
Du skal selv konstruere forespørgselsstrengen og manuelt erstatte @DBName
med faktisk værdi. Du kan dog bruge en parameter i højre side af en ligning uden anførselstegn.
Når du indsætter et objektnavn i en forespørgsel, skal du også altid bruge QUOTENAME fungere. Det vil undslippe navnet korrekt, så der ikke er nogen sql-injektion eller uønsket adfærd forårsaget af bestemte tegn i et objekts navn.
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';