Anda harus menggunakan SQL dinamis jika Anda ingin melakukannya secara dinamis seperti itu. Artinya apa pun yang ingin Anda jalankan di bawah konteks DB itu, Anda juga harus menyertakan dalam pernyataan SQL dinamis.
yaitu asumsikan Anda ingin membuat daftar semua tabel di MainDB:
Ini tidak akan berfungsi, karena pernyataan USE berada dalam konteks yang berbeda - setelah EXECUTE dijalankan, SELECT berikut TIDAK akan berjalan dalam konteks yang sama dan karenanya tidak akan berjalan di MainDb (kecuali koneksi sudah disetel ke MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
Jadi, Anda perlu melakukan:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
Tentu saja, Anda harus sangat berhati-hati dengan injeksi SQL, yang saya arahkan ke tautan di jawaban Barry.
Untuk mencegah Injeksi SQL, Anda juga dapat menggunakan fungsi QUOTENAME(), yang membungkus parameter dalam tanda kurung siku:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);