2010-12-14 11 views
6

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?

+1

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

+0

jaki jest problem z tożsamością @@ i jak korzystać z WYJŚCIA? – ozsenegal

+0

@@ 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. –

Odpowiedz

7
BEGIN TRY 
     insert into tb_cidades values( 
      @txt_nome_cidade, 
      @txt_nome_estado, 
      @txt_pais) 

      set @int_id_cidade = @@identity 
END TRY 

BEGIN CATCH 
      select @int_id_cidade = int_id_cidade 
      from tb_cidades 
      where 
      txt_nome_cidade = @txt_nome_cidade 
END CATCH 
+1

pozbyć się @@ tożsamości, użyj SCOPE_IDENTITY() –

+1

@@ tożsamości v. SCOPE_IDENTITY() nie było częścią pytania (chociaż zgadzam się z tobą) –

+0

nawet myśl, że OP nie pyta o tożsamość @@, jest to oczywisty problem z oryginalnym kodem i łatwo go naprawić. –

0

Następujące osoby spróbują wykonać polecenie. Możesz umieścić wszystko, co chcesz uruchomić w bloku CATCH, który będzie uruchamiany tylko wtedy, gdy wystąpi błąd. Pozostały kod po CATCH będzie działał z błędem lub bez błędu.

BEGIN TRY 
    insert into tb_cidades values(
    @txt_nome_cidade, 
    @txt_nome_estado, 
    @txt_pais) 

     set @int_id_cidade = @@identity 
END TRY 

BEGIN CATCH 
    PRINT 'Error occurred' 

END CATCH 

if(@@error <> 0) 
begin 
select @int_id_cidade = int_id_cidade 
from tb_cidades 
where 
txt_nome_cidade = @txt_nome_cidade 
end