SSMS NE SERA PAS, JE LE RÉPÈTE, PAS PASSÉ AU CONTEXTE D'UNE COMMANDE D'UTILISATION QUE VOUS EXÉCUTEZ EN DYNAMIC SQL.
Si le but ultime est d'exécuter un autre SQL dynamique dans la base de données choisie, c'est assez simple:
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 vous devez passer des paramètres, pas de problème:
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 le but est d'exécuter du SQL statique dans la base de données choisie, vous devriez peut-être envisager de stocker ce SQL statique dans une procédure stockée dans chaque base de données, et de l'appeler dynamiquement comme ceci:
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;
Et j'espère que le but ultime n'est pas d'exécuter tout ce code dans SSMS juste pour que SSMS soit maintenant dans le contexte de @db
... Daniel aimerait vraiment que je déclare explicitement que ce n'est pas possible, comme l'a également déclaré le commentaire de @ Lothar.