Ive postępować zgodnie z procedurą:SQL wyjątek Server Złap i kontynuować
alter procedure sp_insert_cities
(
@txt_nome_cidade varchar(300),
@txt_nome_estado varchar(150) = null,
@txt_pais varchar(150) = null,
@int_id_cidade int output
)
as
begin
//Here an exception may occur
insert into tb_cidades values(
@txt_nome_cidade,
@txt_nome_estado,
@txt_pais)
set @int_id_cidade = @@identity
//Here i want to catch exception and continue executing the proc
if(@@error <> 0)
begin
select @int_id_cidade = int_id_cidade
from tb_cidades
where
txt_nome_cidade = @txt_nome_cidade
end
Po if(@@error <> 0)
linii, chcę kontynuować wykonywanie kodu nawet jeśli są jakieś błędy, ale SQL zgłasza wyjątek do mojej aplikacji i kodu wewnątrz IF warunek nie zostanie wykonany.
Wszelkie pomysły?
Nie chcesz używać @@ tożsamości, jest to niebezpieczne polecenie, które będzie messwith swoją dataintegrity jeśli kiedykolwiek dodać wyzwalaczy do stołu, który wstawi do innych tabel. Zamiast tego należy użyć parametru OUTPUT lub scope_identity(). – HLGEM
jaki jest problem z tożsamością @@ i jak korzystać z WYJŚCIA? – ozsenegal
@@ identity daje wygenerowaną OSTATNĄ wartość tożsamości, która niekoniecznie jest żądaną wartością tożsamości. jeśli masz wyzwalacz na tb_cidades, który wstawia do tabeli historii/dziennika i ma na nim kolumnę tożsamości, otrzymasz tę wartość tożsamości, a nie wartość tożsamości wygenerowaną dla tabeli tb_cidades. Używając SCOPE_IDENTITY() otrzymasz wartość tożsamości wygenerowaną w twoim bieżącym "zasięgu", który byłby na tb_cidades. –