Inquiridor
Oq q eu tô fazendo de errado no CURSOR?

Pergunta
-
Senhores bom dia,
uso o SQLExpress em conjunto com o VS 2005 em C#, segue abaixo um cursor q escrevi para alterar o número dos ITENS na tabela de Itens de Cotação.
ALTER TRIGGER [dbo].[TRG_NUMERO_ITEM_COTACAO_VENDA]
ON [dbo].[TBL_ITENS_COTACAO_VENDA]
AFTER DELETE
AS
DECLARE @intCodigoCotacao bigint
DECLARE @intCodigoItemCotacao bigint
DECLARE @intNumeroItem bigintSET @intCodigoCotacao = (SELECT COT_VEN_CODIGO FROM DELETED)
SET @intNumeroItem = 1DECLARE CRS_NUMERO_ITEM CURSOR FOR
SELECT
ITE_COT_VEN_CODIGO
FROM
TBL_ITENS_COTACAO_VENDA
WHERE
COT_VEN_CODIGO = @intCodigoCotacao
ORDER BY
ITE_COT_VEN_CODIGOOPEN CRS_NUMERO_ITEM
FETCH NEXT FROM CRS_NUMERO_ITEM INTO @intCodigoItemCotacao;
WHILE @@FETCH_STATUS = 0
BEGINUPDATE
TBL_ITENS_COTACAO_VENDA
SET
ITE_COT_VEN_CODIGO = @intNumeroItem
WHERE
ITE_COT_VEN_CODIGO = @intCodigoItemCotacao;
SET @intNumeroItem = @intNumeroItem + 1;FETCH NEXT FROM CRS_NUMERO_ITEM INTO @intCodigoItemCotacao;
END;
CLOSE CRS_NUMERO_ITEM;
DEALLOCATE CRS_NUMERO_ITEM;Quando deleto o último item da cotação tudo bem, mas quando deleto o primeiro item não realiza nenhuma iteração e fala q não pode duplicar a chave primária( q é formada pelo Código da Cotação + Número do Item), quando deleto o item nº 4 de 6 itens por exemplo a trigger faz a iteração até chegar no item deletado e dá pau de chave duplicada.
Se alguém puder me ajudar.
Desde já agradeço.
Um abraço,
Pedro.
Todas as Respostas
-
Pedro,
Primeiramente gostaria de alertar sobre o uso de cursor dentro do trigger, isso poderá apresentar problemas de performance, como também lock em suas tables.
O que esta ocorrendo é que o valor que esta passado para a variável @intCodigoItemCotacao esteja incorreto, desta forma, o SQL Server estará fazendo um Update com um valor ITE_COT_VEN_CODIGO = @intNumeroItem
já existente. -
Boa tarde Junior,
Preferia não usar o cursor tb, mas não tive outra idéia de como reordenar o número dos itens após a exclusão de um item qualquer. A variável @intCodigoItemCotacao está percorrendo todos os itens da cotação, ela pula o q foi deletado, mas ao inserir ITE_COT_VEN_CODIGO = @intNumeroItem no item subsequento ao deletado dá o erro "Violation of PRIMARY KEY constraint 'PK_TBL_ITENS_COTACAO_VENDA'. Cannot insert duplicate key in object dbo.TBL_ITENS_COTACAO_VENDA'."
Parâmetros mandando deletar o item 4 de 5 itens
Running [dbo].[up_DeletaItemCotacaoVenda] ( @NumeroCotacao = 62, @NumeroItem = 4, @CodigoProduto = 36 ).
1º iteração
@intCodigoCotacao 62 bigint
@intCodigoItemCotacao 1 bigint
@intNumeroItem 1 bigint
@@FETCH_STATUS 0 int2º iteração
@intCodigoCotacao 62 bigint
@intCodigoItemCotacao 2 bigint
@intNumeroItem 2 bigint
@@FETCH_STATUS 0 int3º iteração
@intCodigoCotacao 62 bigint
@intCodigoItemCotacao 3 bigint
@intNumeroItem 3 bigint
@@FETCH_STATUS 0 int4º iteração
@intCodigoCotacao 62 bigint
@intCodigoItemCotacao 5 bigint
@intNumeroItem 4 bigint
@@FETCH_STATUS 0 intNa quarta iteração é quando vai subistituir o deletado pelo próximo.
Não tô conseguindo achar o erro.
Um abraço,
Pedro