SSMS TIDAK AKAN, AKU BEREPEAT, TIDAK AKAN BERALIH DENGAN KONTEKS PENGGUNAAN YANG ANDA PERLU DILAKUKAN DALAM DINAMIKA SQL.
Jika tujuan utamanya adalah untuk menjalankan beberapa SQL dinamis lain di dalam database yang dipilih, ini cukup mudah:
DECLARE @db sysname = N'db1';
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'SELECT DB_NAME();';
EXEC @exec @sql;
Jika Anda harus melewati parameter, tidak ada masalah:
DECLARE @db sysname = N'db1', @i int = 1;
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'SELECT DB_NAME(), @i;';
EXEC @exec @sql, N'@i int', @i;
Jika tujuannya adalah untuk menjalankan beberapa SQL statis di dalam database yang dipilih, mungkin Anda harus mempertimbangkan menyimpan SQL statis itu dalam prosedur tersimpan di setiap database, dan memanggilnya secara dinamis seperti ini:
DECLARE @db sysname = N'db1';
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'EXEC dbo.procedurename;';
EXEC @exec @sql;
Dan semoga tujuan akhirnya bukan menjalankan semua kode ini di SSMS hanya agar SSMS sekarang dalam konteks @db
... Daniel akan sangat suka jika saya menyatakan secara eksplisit bahwa ini tidak mungkin, seperti komentar @ Lothar juga menyatakan.