За статични заявки, като тази във вашия въпрос, имената на таблици и колони трябва да са статични.
За динамични заявки трябва да генерирате динамично пълния SQL и да използвате sp_executesql, за да го изпълните.
Ето пример за скрипт, използван за сравняване на данни между едни и същи таблици от различни бази данни:
Статична заявка:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
Тъй като искам лесно да променя името на table
и schema
, създадох тази динамична заявка:
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
Тъй като динамичните заявки имат много подробности, които трябва да се вземат предвид и са трудни за поддържане, препоръчвам ви да прочетете:Проклятието и благословиите на динамичния SQL