Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Um nome de tabela como uma variável


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