Đối với các truy vấn tĩnh, như câu hỏi 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 SQL đầy đủ một cách linh hoạt 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 của cùng một 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ó có thể xác định được, tôi khuyên bạn nên đọc: Lời nguyền và phước lành của SQL động