SSMS NO REPETIRÁ, NO CAMBIARÁ AL CONTEXTO DE UN COMANDO DE USO QUE USTED EJECUTE EN SQL DINÁMICO.
Si el objetivo final es ejecutar algún otro SQL dinámico dentro de la base de datos elegida, esto es bastante fácil:
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;
Si necesita pasar parámetros, no hay problema:
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;
Si el objetivo es ejecutar un SQL estático dentro de la base de datos elegida, tal vez debería considerar almacenar ese SQL estático en un procedimiento almacenado en cada base de datos y llamarlo dinámicamente de esta manera:
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;
Y es de esperar que el objetivo final no sea ejecutar todo este código en SSMS solo para que SSMS esté ahora en el contexto de @db
... A Daniel realmente le gustaría si declaro explícitamente que esto no es posible, como también dijo el comentario de @ Lothar.