SQL dinamis tidak bekerja seperti itu.
Anda masih tidak dapat meneruskan parameter ke string dinamis yang akan digunakan sebagai pengganti nama objek.
Anda harus membuat string kueri sendiri, secara manual mengganti @DBName
dengan nilai sebenarnya. Namun, Anda dapat menggunakan parameter di sisi kanan persamaan, tanpa tanda kutip.
Selain itu, saat memasukkan nama objek ke dalam kueri, selalu gunakan QUOTENAME
fungsi. Ini akan keluar dari nama dengan benar sehingga tidak ada injeksi sql atau perilaku yang tidak diinginkan yang disebabkan oleh karakter tertentu dalam nama objek.
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';