Đối với các truy vấn tĩnh, như truy vấn trong câu hỏi của bạn, tên bảng và tên cột cần phải tĩnh.
Đối với các truy vấn động, bạn nên tạo động SQL đầy đủ và sử dụng sp_executesql để thực thi nó.
Dưới đây là một ví dụ về tập lệnh được sử dụng để so sánh dữ liệu giữa các bảng giống nhau của các cơ sở dữ liệu khác nhau:
Truy vấn tĩnh:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
Vì tôi muốn dễ dàng thay đổi tên của table
và schema
, Tôi đã tạo truy vấn động này:
declare @schema varchar(50)
declare @table varchar(50)
declare @query nvarchar(500)
set @schema = 'dbo'
set @table = 'ACTY'
set @query = 'SELECT * FROM [DB_ONE].[' + @schema + '].[' + @table + '] EXCEPT SELECT * FROM [DB_TWO].[' + @schema + '].[' + @table + ']'
EXEC sp_executesql @query
Vì các truy vấn động có nhiều chi tiết cần được xem xét và chúng khó duy trì, tôi khuyên bạn nên đọc:Lời nguyền và phước lành của SQL động