Ocasionalmente recibo preguntas sobre cómo crear un conjunto de resultados T-SQL con nombres de columna dinámicos. Del mismo modo veo gente con problemas para crear tablas temporales con nombres de columna dinámicos. Aunque es fácil crear una sentencia SQL completamente dinámica que pueda mostrar los nombres de las columnas dinámicas, esas sentencias se vuelven difíciles de leer y mantener. Un enfoque más práctico es crear una tabla temporal y, a continuación, cambiar dinámicamente sus columnas antes de insertar en la tabla temporal.
Aunque no se puede crear dinámicamente una tabla temporal y, a continuación, utilizar esa tabla temporal fuera del ámbito de la ejecución dinámica, hay un truco que se puede hacer para solucionar este problema. Puedes simplemente crear una tabla temporal estática y luego cambiar dinámicamente sus columnas. Esto incluye la adición y eliminación de columnas de forma dinámica.
A continuación se muestra un ejemplo de T-SQL para ilustrar este truco.
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;
El código T-SQL anterior devolverá un conjunto de resultados con cuatro columnas donde las tres columnas MONEY tienen nombres de columna con el nombre del mes actual y los dos meses anteriores.
También quiero señalar que los nombres de columna dinámicos no son generalmente una mejor práctica para las soluciones de programación. Para soluciones de aplicación es mejor manejar la visualización de las columnas dentro de la interfaz de usuario que desde el SQL. Pero para sentencias SQL ad hoc, este truco puede ser útil.