none
Usando cursor para consolidar base RRS feed

  • Discussão Geral

  • Ola pessoal estou com uma duvida.

    Eu preciso fazer um cursor para consolidar uma base de dados aonde eu faço um insert se o registro não existir meu código é esse:

    DECLARE   @DtRecebimento NVARCHAR(20)
    ,@Parcela VARCHAR(20)
    ,@Vencimento varchar(60)
    ,@Valor varchar(50)
    ,@NroPedidoFornecedor NVARCHAR(20)
    ,@NroTransEnt varchar(60)
    ,@CodFornecedor varchar(50)
    ,@Tipo varchar(50)
    ,@NroDocumento NVARCHAR(20)
    ,@NroNotaFiscal varchar(60)
    ,@CondicaoPagto varchar(50)
    ,@CodLoja varchar(50)
    -- Cursor para percorrer os nomes dos objetos 


    DECLARE cursor1 CURSOR FOR
    SELECT ItensTransEntPagto.DtRecebimento, ItensTransEntPagto.Parcela, ItensTransEntPagto.Vencimento, 
    ItensTransEntPagto.Valor, TransEnt.NroPedidoFornecedor, ItensTransEntPagto.NroTransEnt, TransEnt.CodFornecedor,
    TransEnt.LojaDestino, ' ' AS Tipo, ItensTransEntPagto.NroDocumento, ItensTransEntPagto.NroNotaFiscal, TransEnt.CondicaoPagto   
    FROM dbaccess...TransEntRecebimento RIGHT JOIN (dbaccess...ItensTransEntPagto LEFT JOIN dbaccess...TransEnt ON ItensTransEntPagto.NroTransEnt = TransEnt.NroTrans) 
    ON (TransEntRecebimento.DtRecebimento = ItensTransEntPagto.DtRecebimento) AND 
    (TransEntRecebimento.NroTransEnt = ItensTransEntPagto.NroTransEnt)  






    -- Abrindo Cursor para leitura
    OPEN cursor1


    ---- Lendo a próxima linha
    FETCH NEXT FROM cursor1 INTO @DtRecebimento 
    ,@Parcela 
    ,@Vencimento 
    ,@Valor 
    ,@NroPedidoFornecedor 
    ,@NroTransEnt
    ,@CodFornecedor
    ,@CodLoja
    ,@Tipo
    ,@NroDocumento
    ,@NroNotaFiscal
    ,@CondicaoPagto
    -- Percorrendo linhas do cursor (enquanto houverem)
    WHILE @@FETCH_STATUS = 0
    BEGIN
    --    SELECT @fullName = @Codigo + '.' + @Descricao
    DECLARE
    @NroEntradaDeb varchar(50)
    ,@ParcelaDeb varchar(50)
    ,@CodLojaDeb varchar(50)


    DECLARE Cursor55 CURSOR FOR SELECT NroEntrada,Parcela,CodLoja FROM Financeiro.dbo.Debito 


    OPEN Cursor55


    FETCH NEXT FROM cursor55 INTO @NroEntradaDeb, @ParcelaDeb,@CodLojaDeb




    WHILE @@FETCH_STATUS = 0
    BEGIN




    IF @NroEntradaDeb <> @NroTransEnt AND @ParcelaDeb <> @Parcela AND  @CodLojaDeb <> @CodLoja


    BEGIN


    INSERT INTO DebitoCons ( DataEmissão, Parcela, Vencimento, TotalLancto, NroTítulo, NroEntrada, 
    CodFornecedor, CodLoja, Tipo, NroDocumento, NroNotaFiscal, CondicaoPagto ) 
    VALUES(@DtRecebimento 
    ,@Parcela 
    ,@Vencimento 
    ,@Valor 
    ,@NroPedidoFornecedor 
    ,@NroTransEnt
    ,@CodFornecedor
    ,@CodLoja
    ,@Tipo
    ,@NroDocumento
    ,@NroNotaFiscal
    ,@CondicaoPagto )





    END


    FETCH NEXT FROM cursor55 INTO @NroEntradaDeb, @ParcelaDeb,@CodLojaDeb


     END






    -- Lendo a próxima linha
    FETCH NEXT FROM cursor1 INTO @DtRecebimento 
    , @Parcela 
    ,@Vencimento 
    ,@Valor
    , @NroPedidoFornecedor
    ,@NroTransEnt 
    ,@CodFornecedor
    ,@CodLoja
    ,@Tipo
    , @NroDocumento
    ,@NroNotaFiscal 
    ,@CondicaoPagto 
    CLOSE cursor55
    -- Desalocando o cursor
    DEALLOCATE cursor55 
    END


    -- Fechando Cursor para leitura
    CLOSE cursor1
    -- Desalocando o cursor
    DEALLOCATE cursor1 

    sábado, 25 de fevereiro de 2012 18:36

Todas as Respostas

  • Paulo,

    Você esta querendo desenvolver um cursor para identificar se um determinado registro existe?

    Não seria mais fácil ao invês de utilizar um Cursor utilizar os operadores Exists ou Not Exists em seu select?

    Outra coisa, qual é a versão do SQL Server que você esta utilizando? Se for o SQL Server 2008 poderia talvez fazer uso do comando Merge!


    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]

    domingo, 26 de fevereiro de 2012 23:58
  • uso sql server 2005, sou novo no sqlserver vou testar esse operador
    segunda-feira, 27 de fevereiro de 2012 11:35