Dynamische SQL werkt niet zo.
U kunt nog steeds geen parameters doorgeven aan een dynamische tekenreeks die wordt gebruikt in plaats van objectnamen.
U moet de queryreeks zelf samenstellen en handmatig @DBName
vervangen met werkelijke waarde. U kunt echter een parameter aan de rechterkant van een vergelijking gebruiken, zonder aanhalingstekens.
Gebruik bij het invoeren van een objectnaam in een query ook altijd de QUOTENAME
functie. Het zal correct ontsnappen aan de naam, dus er is geen sql-injectie of ongewenst gedrag veroorzaakt door bepaalde tekens in de naam van een object.
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';