Build Brasil
Build Brasil
Criando colunas dinâmicas no SQL Server 2005

Uma coisa talvez muito difícil de fazer se for apenas imaginar, e o que nos faz pensar nisso é a falta de vontade de pensar, a lógica é simplesmente básica. Você cria uma tabela temporária, e como é obrigatório criar colunas, crie uma coluna qualquer, por exemplo, uma coluna chamada “ID”, obtenha a lista de colunas que você quer criar dinamicamente. No meu caso, eu tinha uma tabela de valores, que são inseridas com data, e precisava obter os quatro últimos anos dentro dela. Continuando, crio uma estrutura de repetição para percorrer a lista de colunas, e executo a comando “ALTER TABLE” para criar as colunas dinamicamente.

Quando me responderam isso no fórum, não desse jeito, mas já com o exemplo pronto, e vocês logo verão a seguir, fiquei indignado, e pensei por que eu não pensei nisso? É como sempre dizem: “Nunca enxergamos o que esta na nossa frente!”. Mas galera relaxa isso não faz da gente pessoas horríveis, apenas pouco preguiçosas.

Mas vamos ao que interessa, segue o exemplo de criação colunas em tabelas:

/* CRIA A ESTRUTURA PARA OBTER A VARIAÇÃO DOS VALORES
 * DOS ÚLTIMOS 4 ANOS. O QUE DEFINE UMA TABELA TEMPORÁRIA É O CARÁCTER # .
 */
CREATE TABLE #LastYears (id INT IDENTITY(1,1), ANO INT)
--INSERE OS QUATRO ÚLTIMOS DENTRO DA TABELA TEMPORÁRIA
INSERT INTO #LastYears
SELECT DISTINCT TOP 4 YEAR(DATEADD(YEAR, -1, DATA)) AS DATA FROM dbo.tbValores
ORDER BY DATA DESC
--VARIAVEIS PARA FAZER O LOOP
DECLARE @AnoInicial INT
DECLARE @AnoFinal INT
DECLARE @strCmd VARCHAR(300)

/* OBTENHO O PRIMEIRO É O ÚLTIMO ANO */
SELECT @AnoInicial = MIN(ANO), @AnoFinal = MAX(ANO) FROM #LastYears

/* EXECUTO O LOOP */
WHILE @AnoInicial <= @AnoFinal
BEGIN

--ADICIONA AS COLUNAS DINÂMICAMENTE
SET @strCmd = 'Alter Table #LastYears Add [' + CONVERT(VARCHAR,@AnoInicial, 1) + '] INT ' 

EXEC(@strCmd)

SET @AnoInicial = @AnoInicial + 1
END
Não podemos nos esquecer de quando acabar de usar a tabela temporária,
executar o comando DROP TABLE nela,como descrito abaixo:DROP TABLE
#LastYearsBom pessoal, esse foi mais um artigo e mais uma dúvida minha esclarecida!

Posted 13 Jun 2009 13:28 by Abdul Hade
Copyright© Build Brasil 2004 - 2009 - Todos os Direitos Reservados
Powered by Community Server (Commercial Edition), by Telligent Systems