2009-02-03 22 views
102

में लेनदेन के साथ काम करने का सबसे अच्छा तरीका मान लें कि मेरे पास एक SQL कथन है जो वाक्य रचनात्मक रूप से और अर्थात् सही है, इसलिए यह निष्पादित होता है।एमएस एसक्यूएल सर्वर प्रबंधन स्टूडियो

प्रबंधन स्टूडियो (या किसी अन्य क्वेरी उपकरण) कैसे मैं SQL कथन परीक्षण कर सकते हैं, और अगर मैं नोटिस कि वे कुछ करें, रोलबैक तोड़ दिया (एक अलग क्वेरी में?)

उत्तर

192

करने के लिए सबसे आसान तरीका है बात रैप करने के लिए है में लेनदेन में आपका कोड, और फिर लाइन द्वारा टी-एसक्यूएल कोड लाइन के प्रत्येक बैच को निष्पादित करें।

उदाहरण के लिए

,

Begin Transaction 

     -Do some T-SQL queries here. 

Rollback transaction -- OR commit transaction 

आप से निपटने आप एक का प्रयास करें ... कैच ब्लॉक का उपयोग करके ऐसा कर सकते हैं त्रुटि को शामिल करना चाहते हैं। यदि कोई त्रुटि हो तो आप पकड़ ब्लॉक के भीतर ट्रांज़ेक्शन रोलबैक कर सकते हैं।

उदाहरण के लिए:

USE AdventureWorks; 
GO 
BEGIN TRANSACTION; 

BEGIN TRY 
    -- Generate a constraint violation error. 
    DELETE FROM Production.Product 
    WHERE ProductID = 980; 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_SEVERITY() AS ErrorSeverity 
     ,ERROR_STATE() AS ErrorState 
     ,ERROR_PROCEDURE() AS ErrorProcedure 
     ,ERROR_LINE() AS ErrorLine 
     ,ERROR_MESSAGE() AS ErrorMessage; 

    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
END CATCH; 

IF @@TRANCOUNT > 0 
    COMMIT TRANSACTION; 
GO 

अधिक जानकारी के लिए निम्नलिखित लिंक देखें।

http://msdn.microsoft.com/en-us/library/ms175976.aspx

आशा इस लेकिन अगर आप अधिक जानकारी की आवश्यकता तो कृपया मुझे बताएं मदद करता है।

+1

हाय, धन्यवाद। मैंने पहली बार @@ TRANCOUNT के बारे में देखा और क्या आप मुझे बता सकते हैं कि रोलबैक प्रोसेसिंग के बाद "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION" क्या होता है? और @@ TRANCOUNT का क्या मूल्य है? एक बार फिर धन्यवाद। – QMaster

+1

रोलबैक ट्रांज़ेक्शन @@ ट्रांज़ेक्शन को उत्तेजित करने के बाद 0 पर वापस सेट किया गया है। इसके द्वारा COMMIT ट्रांज़ेक्शन निष्पादित नहीं किया जाएगा। https://msdn.microsoft.com/de-de/library/ms187967.aspx देखें –

2

मैं एक बिंदु जोड़ना चाहता हूं जिसे आप भी कर सकते हैं (और यदि आप जो लिख रहे हैं वह जटिल है) यदि आप परीक्षण मोड में हैं तो रोलबैक में एक टेस्ट वैरिएबल जोड़ें। फिर आप एक ही समय में पूरी चीज निष्पादित कर सकते हैं। अक्सर मैं विभिन्न संचालन के परिणामों के पहले और बाद में देखने के लिए कोड भी जोड़ता हूं, खासकर यदि यह एक जटिल लिपि है।

नीचे उदाहरण:

USE AdventureWorks; 
GO 
DECLARE @TEST INT = 1--1 is test mode, use zero when you are ready to execute 
BEGIN TRANSACTION; 

BEGIN TRY 
    IF @TEST= 1 
     BEGIN 
      SELECT *FROM Production.Product 
       WHERE ProductID = 980; 
     END  
    -- Generate a constraint violation error. 
    DELETE FROM Production.Product 
    WHERE ProductID = 980; 

    IF @TEST= 1 
     BEGIN 
      SELECT *FROM Production.Product 
       WHERE ProductID = 980; 
      IF @@TRANCOUNT > 0 
       ROLLBACK TRANSACTION; 
     END  
END TRY 

BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_SEVERITY() AS ErrorSeverity 
     ,ERROR_STATE() AS ErrorState 
     ,ERROR_PROCEDURE() AS ErrorProcedure 
     ,ERROR_LINE() AS ErrorLine 
     ,ERROR_MESSAGE() AS ErrorMessage; 

    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
END CATCH; 

IF @@TRANCOUNT > 0 AND @TEST = 0 
    COMMIT TRANSACTION; 
GO 
संबंधित मुद्दे