none
ATUALIZAR TABELA USANDO COMANDO FETCH RRS feed

  • Pergunta

  • Prezados, 

    Poderiam dar uma analisada no códio abaixo? 

    Ocorre um erro na linha 41 ("set [id_viagemreal] = "):

    Msg 156, Level 15, State 1, Line 41
    Incorrect syntax near the keyword 'set'.

    O objetivo é atualizar apenas o campo [id_viagemreal] ou seja, trata-se de um UPDATE que não sei se está correto.

    ****  CÓDIGO ****

    -- Declara as variáveis para armazenar os valores retornados por FETCH e outros. 
    declare @count int,@countTP int, @countTS int , @seq varchar(3), @new_code nvarchar(20),@linha_ant nvarchar(7),
    @linha nvarchar(7),@viagemR nvarchar(20), @data date,@sent nvarchar(2),@dia nvarchar(1)

    set @countTP=0
    set @countTS=0


    DECLARE linha_cursor CURSOR FOR

    SELECT cd_linha,id_viagemreal,dt_viagem,cd_sentido,par_tipo_dia FROM tb_viagem_real_temp
    order by cd_linha,cd_sentido

    OPEN linha_cursor

    -- Processa o prmeiro FETCH e armazena o valor delinha na variácel @linha.
    -- Nota: A variável está na mesma ordem das colunas do SELECT
    FETCH NEXT FROM linha_cursor  
    INTO @linha,@viagemR,@data,@sent,@dia

    -- Checa @@FETCH_STATUS para ver se há mais linhas para skips.  
    WHILE @@FETCH_STATUS = 0  
    BEGIN 

    If @linha <> @linha_ant
    begin
    set @countTP=1
    set @countTS=1
    end
    Else
    If rtrim(@sent) = '1'
    begin
    set @countTP = @countTP + 1
    End
    Else 
    begin
    set @countTS = @countTS + 1
    end

    UPDATE
    set [id_viagemreal] = 
     cast(YEAR(@data) as nvarchar(4))+
    replicate('0', (2-len(month(@data))))+
    cast(month(@data) as nvarchar(2))+
    replicate('0', (2-len(day(@data))))+
    cast(day(@data) as nvarchar(2))+
    [@linha]+[@dia]+[@sent]+
    CASE  
    WHEN rtrim(@sent) = '1' 
    THEN 
    replicate('0', (3-len(@countTP))) + cast(@countTP as varchar(3))

    Else 
    replicate('0', (3-len(@countTS))) + cast(@countTS as varchar(3))

    -- Armazena cd_linha anterior para comparar com cd_linha atual
    set @linha_ant = @linha
    -- Avança próximo
    FETCH NEXT FROM linha_cursor
    INTO @linha,@viagemR,@data,@sent,@dia

    END

    CLOSE linha_cursor
    DEALLOCATE linha_cursor 
    GO 

    Aguardo alguma sugestão/orientação.

    Obrigado

    Marco 


    Marco Agostinho

    terça-feira, 4 de abril de 2017 14:48

Respostas

  • Boa tarde,

    Marco, me parece que também está faltando o nome da tabela após o Update.

    E não sei se entendi errado, mas talvez seja possível executar esse Update sem utilizar o Cursor. Não sei se vai alcançar o resultado esperado, mas segue uma sugestão para testes:

    with CTE_RN as
    (
        SELECT 
            cd_linha,
            id_viagemreal,
            dt_viagem,
            cd_sentido,
            par_tipo_dia,
            row_number() over(partition by cd_linha, cd_sentido order by dt_viagem) as RN
        FROM tb_viagem_real_temp
    )
    
    update CTE_RN
    set id_viagemreal] = 
        convert(varchar, dt_viagem, 112) +
        cd_linha +
        par_tipo_dia + 
        cd_sentido +
        replicate('0', 3 - len(RN)) + cast(RN as varchar(3))
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Marco Agostinho quarta-feira, 5 de abril de 2017 18:13
    terça-feira, 4 de abril de 2017 18:29

Todas as Respostas

  • Deleted
    terça-feira, 4 de abril de 2017 15:17
  • Boa tarde,

    Marco, me parece que também está faltando o nome da tabela após o Update.

    E não sei se entendi errado, mas talvez seja possível executar esse Update sem utilizar o Cursor. Não sei se vai alcançar o resultado esperado, mas segue uma sugestão para testes:

    with CTE_RN as
    (
        SELECT 
            cd_linha,
            id_viagemreal,
            dt_viagem,
            cd_sentido,
            par_tipo_dia,
            row_number() over(partition by cd_linha, cd_sentido order by dt_viagem) as RN
        FROM tb_viagem_real_temp
    )
    
    update CTE_RN
    set id_viagemreal] = 
        convert(varchar, dt_viagem, 112) +
        cd_linha +
        par_tipo_dia + 
        cd_sentido +
        replicate('0', 3 - len(RN)) + cast(RN as varchar(3))
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Marco Agostinho quarta-feira, 5 de abril de 2017 18:13
    terça-feira, 4 de abril de 2017 18:29
  • Obrigado, sua solução foi perfeita, além de ser bem mais simples.

    Já testei e funcionou conforme o esperado.

    Mais uma vez, obrigado.


    Marco Agostinho

    quarta-feira, 5 de abril de 2017 18:09
  • Diz,

    Já tinha verificado esse End, mas continuou com o problema.

    A solução do amigo gapimex (logo abaixo) deu certo e é bem mais simples.

    Obrigado pelo seu tempo, amigo.


    Marco Agostinho

    quarta-feira, 5 de abril de 2017 18:11