none
Adicionar campo na tabela dicamicamente vindo com um resultado da select RRS feed

  • 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 = 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
                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 on

    Ele 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....

                                                                                        
    quinta-feira, 20 de junho de 2013 15:34

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.

    quinta-feira, 20 de junho de 2013 15:44
  • 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]

    quinta-feira, 20 de junho de 2013 17:42