Para consultas estáticas, como a da sua pergunta, os nomes de tabelas e 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 script usado para comparar dados entre as mesmas tabelas de bancos de dados diferentes:
consulta estática:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
desde que eu quero mudar facilmente o nome 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