SSMS จะไม่ใช้ซ้ำฉันจะไม่สลับไปยังบริบทของการใช้คำสั่งที่คุณใช้ใน DYNAMIC 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 ระบุไว้ด้วย