none
Usando Cursor para definir Sequencial RRS feed

  • Pergunta

  •  

    Pessoas,

     

    Gostaria que vocês dessem uma ajudinha.

     

    Tenho 920 mil registros em uma tabela que eu gostaria de gerar um sequencial para estes.

     

    Na tabela tenho o Numero da Operacao e a Parcela. Mas essa parcela está incorreta. Tenho que gerar novamente.

     

    Estou utilizando o cursor para fazer este trabalho, sei que cursor demora muito, gasta no consumo de processamento e tudo mais. Porem tive que utilizá-lo.

     

    Mas tá demorando muito e eu preciso dessas informações urgentemente.

     

    Exemplo:

     

    Operacao     |        Parcela_ant       |      Parcela_nova

     

    123              |                 5              |             1

    123              |                 7              |             2

    789              |                 20            |             1

     

    Assim por diante.

     

    Alguém tem um método mais facil para fazer isto?

     

    Atualmente utilizo o SQL 2000, mas se tiver a solução no 2005 eu consigo fazer nele sem problemas.

     

    Agradeço desde já.

     

    []'s

     

    Rafael Krisller

    quinta-feira, 16 de outubro de 2008 20:15

Respostas

  • Oi Rafael,

     

    Então como o pessoal ainda vai demorar para voltar por aqui...

    Segue a solução 2005 based.

     

    Code Snippet

    CREATE TABLE tblParc (Operacao INT, Parcela_Ant INT, Parcela_Nova INT)

    INSERT INTO tblParc VALUES (123,5,NULL)

    INSERT INTO tblParc VALUES (123,7,NULL)

    INSERT INTO tblParc VALUES (789,5,NULL)

    INSERT INTO tblParc VALUES (789,8,NULL)

    INSERT INTO tblParc VALUES (789,9,NULL)

    INSERT INTO tblParc VALUES (543,2,NULL)

    INSERT INTO tblParc VALUES (543,6,NULL)

    INSERT INTO tblParc VALUES (543,7,NULL)

    INSERT INTO tblParc VALUES (543,8,NULL)

     

    -- Antes da atualização

    SELECT Operacao, Parcela_Ant, Parcela_Nova

    FROM tblParc

     

    WITH Parcelas AS (

    SELECT Operacao, Parcela_Ant,

    ROW_NUMBER() OVER (PARTITION BY Operacao ORDER BY Parcela_Ant ASC)

    AS Parcela_Nova FROM tblParc)

     

    UPDATE tblParc SET Parcela_Nova = Parcelas.Parcela_Nova

    FROM tblParc

    INNER JOIN Parcelas ON tblParc.Operacao = Parcelas.Operacao AND

    tblParc.Parcela_Ant = Parcelas.Parcela_Ant

     

    -- Após a atualização

    SELECT Operacao, Parcela_Ant, Parcela_Nova

    FROM tblParc

     

     

    [ ]s,

     

    Gustavo

    quinta-feira, 16 de outubro de 2008 20:50

Todas as Respostas

  • Olá Rafael,

     

    Acho que o tempo que o cursor vai demorar vai ser suficiente pra todo mundo voltar do TechED e dar opiniões.

    Possuo uma solução 2000 e uma 2005. A 2005 é com certeza mais performática mas só funciona no 2005. Posso utilizá-la ou ficaremos na 2000 ?

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 16 de outubro de 2008 20:34
  •  

    Gustavo,

     

    Foi o que eu imaginei... hauahuaha ta demorando muito.

     

    Pode ser a do 2005.

     

     

     

    quinta-feira, 16 de outubro de 2008 20:41
  • Oi Rafael,

     

    Então como o pessoal ainda vai demorar para voltar por aqui...

    Segue a solução 2005 based.

     

    Code Snippet

    CREATE TABLE tblParc (Operacao INT, Parcela_Ant INT, Parcela_Nova INT)

    INSERT INTO tblParc VALUES (123,5,NULL)

    INSERT INTO tblParc VALUES (123,7,NULL)

    INSERT INTO tblParc VALUES (789,5,NULL)

    INSERT INTO tblParc VALUES (789,8,NULL)

    INSERT INTO tblParc VALUES (789,9,NULL)

    INSERT INTO tblParc VALUES (543,2,NULL)

    INSERT INTO tblParc VALUES (543,6,NULL)

    INSERT INTO tblParc VALUES (543,7,NULL)

    INSERT INTO tblParc VALUES (543,8,NULL)

     

    -- Antes da atualização

    SELECT Operacao, Parcela_Ant, Parcela_Nova

    FROM tblParc

     

    WITH Parcelas AS (

    SELECT Operacao, Parcela_Ant,

    ROW_NUMBER() OVER (PARTITION BY Operacao ORDER BY Parcela_Ant ASC)

    AS Parcela_Nova FROM tblParc)

     

    UPDATE tblParc SET Parcela_Nova = Parcelas.Parcela_Nova

    FROM tblParc

    INNER JOIN Parcelas ON tblParc.Operacao = Parcelas.Operacao AND

    tblParc.Parcela_Ant = Parcelas.Parcela_Ant

     

    -- Após a atualização

    SELECT Operacao, Parcela_Ant, Parcela_Nova

    FROM tblParc

     

     

    [ ]s,

     

    Gustavo

    quinta-feira, 16 de outubro de 2008 20:50
  •  

    Grande Gustavo,

     

    Não sei porque mas o With não funcionou, dava erro em parenteses ")" . Olhei a sintaxe dele e alterei pra

     

    With Parcelas ( Operacao, Parcela_ant, Parcela_nova) as

    (

    Select ......

    )

     

     

    Mesmo assim nada.

     

    Mas o que eu precisava não era do With e sim do 

    Code Snippet

    ROW_NUMBER() OVER (PARTITION BY Operacao ORDER BY Parcela_Ant ASC)

     

     

    que me poupou boas horas de processamento.

     

    Muito Obrigado Gustavo.

     

    []'s

     

    Rafael Krisller

    quinta-feira, 16 de outubro de 2008 22:32