Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Un nom de table comme variable

Pour les requêtes statiques, comme celle de votre question, les noms de table et les noms de colonne doivent être statiques.

Pour les requêtes dynamiques, vous devez générer dynamiquement le SQL complet et utiliser sp_executesql pour l'exécuter.

Voici un exemple de script utilisé pour comparer les données entre les mêmes tables de différentes bases de données :

Requête statique :

SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]

Puisque je veux changer facilement le nom de table et schema , j'ai créé cette requête dynamique :

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

Étant donné que les requêtes dynamiques comportent de nombreux détails qui doivent être pris en compte et qu'elles sont difficiles à maintenir, je vous recommande de lire :La malédiction et les bénédictions du SQL dynamique