Для статических запросов, таких как в вашем вопросе, имена таблиц и столбцов должны быть статическими.
Для динамических запросов вы должны генерировать полный 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