SSMS S NOT KHÔNG, TÔI SỬA CHỮA, S SW KHÔNG CHUYỂN ĐẾN TIẾP THEO MỘT QUY TẮC SỬ DỤNG BẠN CHẠY TRONG SQL NĂNG ĐỘNG.
Nếu mục tiêu cuối cùng là thực thi một số SQL động khác bên trong cơ sở dữ liệu đã chọn, thì điều này đủ dễ dàng:
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;
Nếu bạn cần truyền tham số, không có vấn đề gì:
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;
Nếu mục tiêu là thực thi một số SQL tĩnh bên trong cơ sở dữ liệu đã chọn, có lẽ bạn nên xem xét việc lưu trữ SQL tĩnh đó trong một thủ tục được lưu trữ trong mỗi cơ sở dữ liệu và gọi nó một cách linh hoạt như sau:
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;
Và hy vọng mục tiêu cuối cùng là không chạy tất cả mã này trong SSMS để SSMS hiện đang ở trong bối cảnh @db
... Daniel thực sự thích nó nếu tôi tuyên bố rõ ràng rằng điều này là không thể, như nhận xét của @ Lothar cũng nêu.