Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dario Gomes

Tratar erro de Primary Key duplicada ao fazer um Insert

Recommended Posts

Caros

Ralei para tratar um situação onde precisei fazer um INSERT conforme o exemplo que retornava o erro de violação da PRIMARY KEY:

INSERT INTO PEDIDOS (PEDIDO, DATA, EMPRESA, VALIDACAO)
SELECT PEDIDO, DATA, EMPRESA, VALIDACAO
FROM
PEDIDOSGERAL

WHERE DATA BETWEEN CONVERT(DATE, GETDATE()-30) AND CONVERT(DATE, GETDATE())
AND ESCRITÓRIO = 'A'

Para tratar o erro usei uma função que verifica se o registro existe antes de fazer o INSERT e o codigo ficou assim:

INSERT INTO PEDIDOS (PEDIDO, DATA, EMPRESA, VALIDACAO)
SELECT A.PEDIDO, A.DATA, A.EMPRESA, A.VALIDACAO
FROM
PEDIDOSGERAL AS A
WHERE A.DATA BETWEEN CONVERT(DATE, GETDATE()-30) AND CONVERT(DATE, GETDATE())
AND ESCRITÓRIO = 'A'
AND NOT EXISTS (SELECT PEDIDO
FROM PEDIDOS AS B
WHERE B.PEDIDO = A.PEDIDO)

*Não posso efetuar um DELETE usando o critério de DATA pois existe uma trava no campo VALIDACAO e quando esse for alterado para 'SIM' não pode sofrer alterações.

Pergunta: Existe alguma maneira que possa melhorar o código em busca de performace?



"Não há nada que seja bom o suficiente que não possa ser melhorado."

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu uso o BEGIN TRY para tratamento de erro:

begin try  begin tran                             select 1/0                commit tran;       end try    begin catch   selectERROR_NUMBER() AS ErrorNumber,        ERROR_SEVERITY() AS ErrorSeverity,        ERROR_STATE() as ErrorState,        ERROR_PROCEDURE() as ErrorProcedure,        ERROR_LINE() as ErrorLine,        ERROR_MESSAGE() as ErrorMessage;        rollback tran;       end catch

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.