O SSMS NÃO REPETIRÁ, NÃO MUDARÁ AO CONTEXTO DE UM COMANDO DE USO QUE VOCÊ EXECUTAR NO SQL DINÂMICO.
Se o objetivo final é executar alguma outra SQL dinâmica dentro do banco de dados escolhido, isso é 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;
Se você precisar passar parâmetros, não há 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;
Se o objetivo é executar algum SQL estático dentro do banco de dados escolhido, talvez você deva considerar armazenar esse SQL estático em um procedimento armazenado em cada banco de dados e chamá-lo dinamicamente assim:
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;
E, esperançosamente, o objetivo final não é executar todo esse código no SSMS, apenas para que o SSMS esteja agora no contexto de @db
... Daniel realmente gostaria se eu declarasse explicitamente que isso não é possível, como também afirmou o comentário de @ Lothar.