Para consultas estáticas, como a da sua pergunta, os nomes das tabelas e das colunas precisam ser estáticos.
Para consultas dinâmicas, você deve gerar o SQL completo dinamicamente e usar sp_executesql para executá-lo.
Aqui está um exemplo de um script usado para comparar dados entre as mesmas tabelas de diferentes bancos de dados:
Consulta estática:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
Como quero alterar facilmente o nome da
table
e schema
, criei esta consulta dinâmica: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
Como as consultas dinâmicas têm muitos detalhes que precisam ser considerados e são difíceis de manter, recomendo que você leia:A maldição e as bênçãos do SQL dinâmico