SSMS НЕ БУДЕТ, ПОВТОРЯЮ, НЕ ПОЛУЧИТСЯ В КОНТЕКСТЕ КОМАНДЫ ИСПОЛЬЗОВАНИЯ, КОТОРЫЙ ВЫ БУДЕТЕ ДИНАМИЧНЫМ SQL
Если конечной целью является выполнение некоторого другого динамического SQL внутри выбранной базы данных, это достаточно просто:
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;
Если вам нужно передать параметры, нет проблем:
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;
Если цель состоит в том, чтобы выполнить некоторый статический SQL внутри выбранной базы данных, возможно, вам следует рассмотреть возможность сохранения этого статического SQL в хранимой процедуре в каждой базе данных и динамического его вызова следующим образом:
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;
И, надеюсь, конечная цель не состоит в том, чтобы запускать весь этот код в SSMS просто для того, чтобы SSMS теперь находился в контексте @db
... Дэниелу очень понравилось бы, если бы я прямо заявил, что это невозможно, как отмечается в комментарии @ Lothar.