W przypadku zapytań statycznych, takich jak to w pytaniu, nazwy tabel i nazwy kolumn muszą być statyczne.
W przypadku zapytań dynamicznych należy dynamicznie generować pełny kod SQL, a do jego wykonania użyć sp_executesql.
Oto przykład skryptu używanego do porównywania danych między tymi samymi tabelami w różnych bazach danych:
Zapytanie statyczne:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
Ponieważ chcę łatwo zmienić nazwę table
i schema
, stworzyłem to dynamiczne zapytanie:
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
Ponieważ zapytania dynamiczne zawierają wiele szczegółów, które należy wziąć pod uwagę i są trudne do utrzymania, polecam lekturę:Przekleństwo i błogosławieństwo dynamicznego SQL