2010-12-14 13 views
6

Ive प्रक्रिया का पालन करें:एसक्यूएल सर्वर पकड़ने अपवाद और जारी रखने के

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 

if(@@error <> 0) लाइन के बाद, मैं भी अगर कोई त्रुटि है कोड को क्रियान्वित जारी रखना चाहते हैं, लेकिन SQL अपने आवेदन के लिए एक अपवाद और कोड यदि अंदर फेंकता स्थिति निष्पादित नहीं की जाएगी।

कोई भी विचार?

+1

आप @@ पहचान का उपयोग नहीं करना चाहते हैं, यह एक असुरक्षित कमांड है जो आपके डेटाटाइटीटी के साथ गड़बड़ करेगा यदि आप कभी भी टेबल पर ट्रिगर्स जोड़ते हैं जो अन्य तालिकाओं में डालें। इसके बजाय OUTPUT या scope_identity() का उपयोग करें। – HLGEM

+0

@@ पहचान के साथ क्या समस्या है? और मैं OUTPUT का उपयोग कैसे करूं? – ozsenegal

+0

@@ पहचान आपको अंतिम पहचान मूल्य उत्पन्न करती है, जो आवश्यक रूप से पहचान मूल्य नहीं है। यदि आपके पास tb_cidades पर ट्रिगर है जो किसी इतिहास/लॉग तालिका में सम्मिलित होता है और उसके पास एक पहचान कॉलम है, तो आपको उस पहचान मान मिलते हैं, न कि tb_cidades तालिका के लिए उत्पन्न पहचान मान। SCOPE_IDENTITY() का उपयोग करके आपको अपने वर्तमान "स्कोप" के भीतर उत्पन्न पहचान मान मिलता है, जो tb_cidades पर होगा। –

उत्तर

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

@@ पहचान से छुटकारा पाएं, SCOPE_IDENTITY() –

+1

@@ पहचान v। SCOPE_IDENTITY() का उपयोग प्रश्न का हिस्सा नहीं था (हालांकि मैं आपसे सहमत हूं) –

+0

ने सोचा कि ओपी @@ पहचान के बारे में नहीं पूछता है, यह मूल कोड और आसानी से तय के साथ एक स्पष्ट समस्या है। –

0

निम्नलिखित आपके आदेश को चलाने का प्रयास करेंगे। आप कुछ भी डाल सकते हैं जिसे आप कैच ब्लॉक में चलाना चाहते हैं, जो केवल तब होता है जब कोई त्रुटि होती है। कैच के बाद शेष कोड त्रुटि या त्रुटि के बिना चलाएगा।

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 
संबंधित मुद्दे