Usuário com melhor resposta
Usando Cursor para definir Sequencial

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
Respostas
-
Oi Rafael,
Então como o pessoal ainda vai demorar para voltar por aqui...
Segue a solução 2005 based.
Code SnippetCREATE
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_NovaFROM
tblParcWITH
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_NovaFROM
tblParcINNER
JOIN Parcelas ON tblParc.Operacao = Parcelas.Operacao ANDtblParc
.Parcela_Ant = Parcelas.Parcela_Ant-- Após a atualização
SELECT
Operacao, Parcela_Ant, Parcela_NovaFROM
tblParc[ ]s,
Gustavo
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
-
-
Oi Rafael,
Então como o pessoal ainda vai demorar para voltar por aqui...
Segue a solução 2005 based.
Code SnippetCREATE
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_NovaFROM
tblParcWITH
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_NovaFROM
tblParcINNER
JOIN Parcelas ON tblParc.Operacao = Parcelas.Operacao ANDtblParc
.Parcela_Ant = Parcelas.Parcela_Ant-- Após a atualização
SELECT
Operacao, Parcela_Ant, Parcela_NovaFROM
tblParc[ ]s,
Gustavo
-
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 SnippetROW_NUMBER() OVER (PARTITION BY Operacao ORDER BY Parcela_Ant ASC)
que me poupou boas horas de processamento.
Muito Obrigado Gustavo.
[]'s
Rafael Krisller