SSMS NIE BĘDZIE, POWTARZAĆ, NIE PRZEŁĄCZA SIĘ DO KONTEKSTU POLECENIA UŻYTKOWNIKA W DYNAMICZNYM SQL.
Jeśli ostatecznym celem jest wykonanie innego dynamicznego SQL w wybranej bazie danych, jest to dość łatwe:
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;
Jeśli potrzebujesz przekazać parametry, nie ma problemu:
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;
Jeśli celem jest wykonanie statycznego SQL w wybranej bazie danych, być może powinieneś rozważyć zapisanie tego statycznego SQL w procedurze przechowywanej w każdej bazie danych i wywołanie go dynamicznie w następujący sposób:
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;
I miejmy nadzieję, że ostatecznym celem nie jest uruchomienie całego tego kodu w SSMS, tak aby SSMS był teraz w kontekście @db
... Danielowi bardzo by się spodobało, jeśli wyraźnie stwierdzę, że nie jest to możliwe, jak stwierdził również komentarz Lothara.