L'SQL dinamico non funziona in questo modo.
Non è ancora possibile passare parametri a una stringa dinamica che verrà utilizzata al posto dei nomi degli oggetti.
Devi costruire tu stesso la stringa di query, sostituendo manualmente @DBName
con valore reale. Tuttavia, puoi utilizzare un parametro sul lato destro di un'equazione, senza virgolette.
Inoltre, quando inserisci il nome di un oggetto in una query, usa sempre QUOTENAME
funzione. Escluderà correttamente il nome in modo che non ci siano sql injection o comportamenti indesiderati causati da determinati caratteri nel nome di un oggetto.
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';