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