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.