Dynamisches SQL funktioniert so nicht.
Sie können immer noch keine Parameter an eine dynamische Zeichenfolge übergeben, die anstelle von Objektnamen verwendet wird.
Sie müssen die Abfragezeichenfolge selbst erstellen und @DBName
manuell ersetzen mit tatsächlichem Wert. Sie können jedoch einen Parameter auf der rechten Seite einer Gleichung ohne Anführungszeichen verwenden.
Wenn Sie einen Objektnamen in eine Abfrage einfügen, verwenden Sie außerdem immer den QUOTENAME
Funktion. Der Name wird korrekt maskiert, sodass keine SQL-Einschleusung oder unerwünschtes Verhalten durch bestimmte Zeichen im Namen eines Objekts verursacht wird.
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';