SQL Server – Comment créer une table temporaire avec des noms de colonnes dynamiques | Ardalyst

Occasionnellement, je reçois des questions sur la façon de créer un ensemble de résultats T-SQL avec des noms de colonnes dynamiques. De même, je vois des personnes ayant des problèmes pour créer des tables temporaires avec des noms de colonnes dynamiques. Bien qu’il soit facile de créer une instruction SQL entièrement dynamique qui peut afficher les noms de colonnes dynamiques, ces instructions deviennent difficiles à lire et à maintenir. Une approche plus pratique consiste à créer une table temporaire, puis à modifier dynamiquement ses colonnes avant de les insérer dans la table temporaire.
Bien que vous ne puissiez pas créer dynamiquement une table temporaire et utiliser ensuite cette table temporaire en dehors de la portée de l’exécution dynamique, il y a une astuce que vous pouvez faire pour contourner ce problème. Vous pouvez simplement créer une table temporaire statique, puis modifier dynamiquement ses colonnes. Cela inclut l’ajout et la suppression de colonnes de manière dynamique.
Vous trouverez ci-dessous un exemple de T-SQL pour illustrer cette astuce.

IF OBJECT_ID('tempdb..#T', 'U') IS NOT NULL DROP TABLE #T; DECLARE @ColumnName01 VARCHAR(50) , @ColumnName02 VARCHAR(50) , @ColumnName03 VARCHAR(50) , @ColumnName04 VARCHAR(50);SELECT @ColumnName01 = '' , @ColumnName02 = '' , @ColumnName03 = '' , @ColumnName04 = '';/* You cannot create a temp table with dynamic SQL because it will not be available outside the scope of the dynamic SQL call. */CREATE TABLE #T ( TempColumn INT );/* But you can ALTER an existing temp table with Dynamic SQL.*/DECLARE @SQL NVARCHAR(200);SET @SQL = 'ALTER TABLE #T ADD ';SET @SQL += @ColumnName01 + ' VARCHAR(50) NULL, ';SET @SQL += @ColumnName02 + ' MONEY NULL, ';SET @SQL += @ColumnName03 + ' MONEY NULL, ';SET @SQL += @ColumnName04 + ' MONEY NULL ';EXEC sys.sp_executesql @SQL; /* Optionally, you can remove any static columns after you've appended the dynamic columns.*/ALTER TABLE #T DROP COLUMN TempColumn;INSERT INTO #TVALUES ( 'Eric', '120.01', '200.32', '345.00' ) , ( 'Ralph', '132.03', '33.3', '341.13' ), ( 'David', '987.3', '30.77', '879.00' );SELECT * FROM #T;IF OBJECT_ID('tempdb..#T', 'U') IS NOT NULL DROP TABLE #T;

Le code T-SQL ci-dessus renverra un ensemble de résultats avec quatre colonnes où les trois colonnes MONEY ont des noms de colonne nommés d’après le mois en cours et les deux mois précédents.
Capture2
Je tiens également à noter que les noms de colonnes dynamiques ne sont généralement pas une bonne pratique pour les solutions de programmation. Pour les solutions applicatives, il est préférable de gérer l’affichage des colonnes dans l’interface utilisateur plutôt que dans le SQL. Mais pour les instructions SQL ad hoc, cette astuce peut être utile.

0 Shares

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *