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
Um pouco atrasado para uma resposta, mas deve ajudar outra pessoa:
fonte
COUNT(*)
?Você não pode usar um nome de tabela para uma variável, mas sim:
fonte
Você precisará gerar o sql dinamicamente:
fonte
Use
sp_executesql
para executar qualquer SQL, por exemplofonte
Além disso, você pode usar isso ...
fonte
fonte
você precisa usar o SQL dinâmico do SQL Server
Use EXEC para executar qualquer SQL
Use EXEC sp_executesql para executar qualquer SQL
Use EXECUTE sp_executesql para executar qualquer SQL
fonte
fonte