2010-10-14 18 views
15

मेरे पास एक सर्वर से तालिकाओं और पोर्टिंग डेटा बनाने के लिए एक विशाल स्क्रिप्ट है। इसलिए मूल रूप से इस छिद्र में -एसक्यूएल सर्वर में प्रतिबद्ध और रोलबैक लेनदेन कैसे करें?

  1. तालिकाओं के लिए विवरण बनाएं।
  2. इन नव निर्मित तालिकाओं में डेटा पोर्ट करने के लिए सम्मिलित करें।
  3. संग्रहित प्रक्रियाओं के लिए विवरण बनाएं।

तो मैं इस कोड है, लेकिन यह मूल रूप से काम नहीं करता है @@ त्रुटि हमेशा शून्य मुझे लगता है कि है ..

BEGIN TRANSACTION 
--CREATES 
--INSERTS 
--STORED PROCEDURES CREATES 
    -- ON ERROR ROLLBACK ELSE COMMIT THE TRANSACTION 
    IF @@ERROR != 0 
     BEGIN 

      PRINT @@ERROR 
         PRINT 'ERROR IN SCRIPT' 
      ROLLBACK TRANSACTION 
      RETURN 
     END 
    ELSE 
    BEGIN 
     COMMIT TRANSACTION 
     PRINT 'COMMITTED SUCCESSFULLY' 
    END 
    GO 

किसी को भी मदद कर सकते हैं मुझे एक लेन-देन जो मूल रूप से त्रुटि पर रोलबैक और अगर हो जाएंगे बारे में सब कुछ fine..Can मैं किसी भी तरह यहाँ RaiseError का उपयोग करें ..

उत्तर

26

@@ERROR का उपयोग न करें, इसके बजाय BEGIN TRY/BEGIN CATCH का उपयोग करें। एक नमूना प्रक्रिया के लिए Exception handling and nested transactions:: इस लेख देखें

create procedure [usp_my_procedure_name] 
as 
begin 
    set nocount on; 
    declare @trancount int; 
    set @trancount = @@trancount; 
    begin try 
     if @trancount = 0 
      begin transaction 
     else 
      save transaction usp_my_procedure_name; 

     -- Do the actual work here 

lbexit: 
     if @trancount = 0 
      commit; 
    end try 
    begin catch 
     declare @error int, @message varchar(4000), @xstate int; 
     select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE(); 
     if @xstate = -1 
      rollback; 
     if @xstate = 1 and @trancount = 0 
      rollback 
     if @xstate = 1 and @trancount > 0 
      rollback transaction usp_my_procedure_name; 

     raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ; 
     return; 
    end catch 
end 
2

प्रति http://msdn.microsoft.com/en-us/library/ms188790.aspx

@@ त्रुटि के रूप में: पिछले Transact SQL कथन execu के लिए त्रुटि संख्या देता है टेड।

रोलबैक और वापसी करने के लिए आपको प्रत्येक कथन के बाद जांच करनी होगी।

कमिट अंत में हो सकता है।

HTH

0

करने के लिए '@@ त्रुटि' प्रत्यक्ष संदर्भ से बचें। यह एक उड़ान छोटी सी चीज है जिसे खोया जा सकता है।

Declare @ErrorCode int; 
... perform stuff ... 
Set @ErrorCode = @@ERROR; 
... other stuff ... 
if @ErrorCode ...... 
संबंधित मुद्दे