Ocasionalmente recebo perguntas sobre como criar um conjunto de resultados T-SQL com nomes de colunas dinâmicas. Da mesma forma, vejo pessoas com problemas a criar tabelas temporárias com nomes de colunas dinâmicas. Embora seja fácil criar uma instrução SQL inteiramente dinâmica que possa exibir os nomes dinâmicos das colunas, essas instruções tornam-se difíceis de ler e manter. Uma abordagem mais prática é criar uma tabela temporária e depois alterar dinamicamente as suas colunas antes de as inserir na tabela temporária.
Embora não seja possível criar dinamicamente uma tabela temporária e depois utilizar essa tabela temporária fora do âmbito da execução dinâmica, há um truque que pode fazer para contornar este problema. Pode simplesmente criar uma tabela temporária estática e depois alterar dinamicamente as suas colunas. Isto inclui adicionar e remover colunas dinamicamente.
Below é uma amostra do T-SQL para ilustrar este truque.
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;
O código T-SQL acima devolverá um conjunto de resultados com quatro colunas em que as três colunas de DINHEIRO têm nomes de colunas com o nome do mês corrente e dos dois meses anteriores.
br>> também quero notar que os nomes de colunas dinâmicas não são geralmente uma melhor prática para soluções de programação. Para soluções de aplicação é melhor manusear a visualização das colunas dentro da interface do utilizador do que a partir do SQL. Mas para instruções SQL ad hoc, este truque pode ser útil.