Inquiridor
Adicionar campo na tabela dicamicamente vindo com um resultado da select

Pergunta
-
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [SP_PESQUISA_TESTE] (@ib int) AS
set nocount on
SET ANSI_WARNINGS OFF
DECLARE @dt_vencimento char(7) ,
@dt_pagamento char(7)
CREATE TABLE #TMP_PGTO (ID_TURMA INT)
DECLARE PAGAMENTO CURSOR FOR
SELECT dt_vencimento = campo1, dt_pagamento = campo2FROM tabela WHERE campo3 = @ib
OPEN PAGAMENTO
FETCH NEXT FROM PAGAMENTO INTO @dt_vencimento,@dt_pagamento
WHILE @@FETCH_STATUS = 0
BEGIN
IF @dt_pagamento < @dt_vencimento
ALTER TABLE #TMP_PGTO ADD @dt_pagamento char(7)
ELSE
ALTER TABLE #TMP_PGTO ADD @dt_vencimento char(7)
FETCH NEXT FROM PAGAMENTO INTO @dt_vencimento,@dt_pagamento
END
CLOSE PAGAMENTO
DEALLOCATE PAGAMENTO
SELECT ID_TURMA FROM #TMP_PGTO
DROP table #TMP_PGTO
set nocount off
SET ANSI_WARNINGS onEle gera um erro de sintaxe....por que?
Incorrect syntax near '@dt_pagamento'.
Incorrect syntax near '@dt_vencimento'.
Alguém pode me ajudar a resolver este problema?
Agradeço a todos pela ajuda....
Todas as Respostas
-
Julio, acredito que é algo em alterar uma estrutura de tabela utilizando variavel, para isto voce pode colocar todo o comando em uma variavel e executa-la, mudei tambem o else que estava dando erro, tente assim:
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [SP_PESQUISA_TESTE] (@ib int) AS set nocount on SET ANSI_WARNINGS OFF DECLARE @dt_vencimento char(7) , @dt_pagamento char(7), @sql varchar(800) CREATE TABLE #TMP_PGTO (ID_TURMA INT) DECLARE PAGAMENTO CURSOR FOR SELECT dt_vencimento = campo1, dt_pagamento = campo2 FROM tabela WHERE campo3 = @ib OPEN PAGAMENTO FETCH NEXT FROM PAGAMENTO INTO @dt_vencimento,@dt_pagamento WHILE @@FETCH_STATUS = 0 BEGIN IF @dt_pagamento < @dt_vencimento set @sql = 'ALTER TABLE #TMP_PGTO ADD ' + @dt_pagamento + ' char(7)' exec(@sql) IF @dt_pagamento >= @dt_vencimento set @sql = 'ALTER TABLE #TMP_PGTO ADD ' + @dt_pagamento + ' char(7)' exec(@sql) FETCH NEXT FROM PAGAMENTO INTO @dt_vencimento,@dt_pagamento END CLOSE PAGAMENTO DEALLOCATE PAGAMENTO SELECT ID_TURMA FROM #TMP_PGTO DROP table #TMP_PGTO set nocount off SET ANSI_WARNINGS on
Alexandre Matayosi Conde Mauricio.
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 20 de junho de 2013 17:40
-
Julio,
A observação do Alexandre esta correta, mas eu fiquei com uma pequena dúvida.
Você esta criando um IF para validar se a Data de Pagamento é < que a Data de Vencimento, até ai tudo bem, mas será que é necessário?
IF @dt_pagamento < @dt_vencimento set @sql = 'ALTER TABLE #TMP_PGTO ADD ' + @dt_pagamento + ' char(7)' exec(@sql) IF @dt_pagamento >= @dt_vencimento set @sql = 'ALTER TABLE #TMP_PGTO ADD ' + @dt_pagamento + ' char(7)' exec(@sql)
Pois tanto ela sendo maior ou menor você esta adicionando a coluna na sua Temp Table?
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]