5

मैं एक सौदे में कोई त्रुटि होती है तो रोलबैक कर सकते हैं:TSQL लेन-देन एक बयान के बाद दोनों @@ त्रुटि और @@ ROWCOUNT जाँच

CREATE PROCEDURE [dbo].[MySproc] 
(
    @Param1 [int] 
) 
AS 
BEGIN TRAN 
SET NOCOUNT ON; 

SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 
... 

लेकिन अगर Col1 = @Param1 लेनदेन के साथ Table1 में कोई एंट्री नहीं है सफलतापूर्वक करता है, जो मेरे लिए बुरा है। मैं जांचना चाहता हूं कि Col2 = 'something' वास्तव में किया गया है या नहीं। यदि नहीं, तो एक विशेष वापसी कोड के साथ रोलबैक।
अगर मैं @@error जांच के बाद @@rowcount जांच सम्मिलित करने के लिए, निम्नलिखित की तरह का प्रयास करें:

CREATE PROCEDURE [dbo].[MySproc] 
(
    @Param1 [int] 
) 
AS 
BEGIN TRAN 
SET NOCOUNT ON; 

SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 

IF @@ROWCOUNT = 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -27 
END 
... 

यह हमेशा की तरह, इस बिंदु पर रोलबैक क्योंकि @@rowcount आखिरी बयान का मूल्यांकन करता है तो वह हमेशा 0 बराबर होती है।

@@error और प्रभावित पंक्तियों की संख्या दोनों को कैसे जांचें?

उत्तर

11

दोनों एक क्वेरी में अपने खुद के वैरिएबल में स्टोर है, तो जाँच:

DECLARE @rc int 
DECLARE @err int 
SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 
SELECT @rc = @@ROWCOUNT,@err = @@ERROR 

IF @err <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 

IF @rc = 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -27 
END 
+0

+1। हां। यह एक क्लासिक गलती है। –

संबंधित मुद्दे