SQL Server – Come creare una tabella temporanea con nomi di colonne dinamici | Ardalyst

Occasione, ricevo domande su come creare un set di risultati T-SQL con nomi di colonne dinamiche. Allo stesso modo vedo persone con problemi nella creazione di tabelle temporanee con nomi di colonne dinamiche. Mentre è facile creare una dichiarazione SQL interamente dinamica che può visualizzare i nomi di colonna dinamici, queste dichiarazioni diventano difficili da leggere e mantenere. Un approccio più pratico è quello di creare una tabella temporanea e poi cambiare dinamicamente le sue colonne prima di inserirle nella tabella temporanea.
Mentre non è possibile creare dinamicamente una tabella temporanea e poi usare quella tabella temporanea al di fuori dell’ambito dell’esecuzione dinamica, c’è un trucco che si può fare per aggirare questo problema. Potete semplicemente creare una tabella temporanea statica e poi cambiare dinamicamente le sue colonne. Questo include l’aggiunta e la rimozione di colonne in modo dinamico.
Di seguito è riportato un esempio di T-SQL per illustrare questo trucco.

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;

Il codice T-SQL di cui sopra restituirà un set di risultati con quattro colonne dove le tre colonne MONEY hanno nomi di colonne chiamate come il mese corrente e i due mesi precedenti.
Cattura2
Voglio anche notare che i nomi delle colonne dinamiche non sono generalmente una buona pratica per le soluzioni di programmazione. Per le soluzioni applicative è meglio gestire la visualizzazione delle colonne all’interno dell’interfaccia utente piuttosto che dall’interno dell’SQL. Ma per dichiarazioni SQL ad hoc, questo trucco può essere utile.

0 Shares

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *