Para consultas estáticas, como la de su pregunta, los nombres de las tablas y las columnas deben ser estáticos.
Para consultas dinámicas, debe generar el SQL completo dinámicamente y usar sp_executesql para ejecutarlo.
Aquí hay un ejemplo de un script usado para comparar datos entre las mismas tablas de diferentes bases de datos:
Consulta estática:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
Ya que quiero cambiar fácilmente el nombre de table
y schema
, he creado 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
Dado que las consultas dinámicas tienen muchos detalles que deben tenerse en cuenta y son difíciles de mantener, le recomiendo que lea:La maldición y las bendiciones del SQL dinámico