2016-09-16 10 views
1

私はstored procedureを持っています。これは与えられたレコードがあればテーブルからレコードを削除します。@@ RowCount内部のTryブロックが正しい値を返していない--Sql Server

CREATE PROCEDURE [dbo].[USP_DTEST] 
@CfgKey AS VARCHAR(100) 
AS 
BEGIN 
SET NOCOUNT ON; 

    BEGIN TRY 
    BEGIN TRAN 
    --Deletes ConfigSetting table if data exists 
    IF EXISTS 
    (
    SELECT 1 
    FROM [dbo].[ConfigSetting] 
    WHERE CfgKey = @CfgKey 
    AND RowStatus = 'A' 
    ) 
    BEGIN 
     DELETE 
     FROM [dbo].[ConfigSetting] 
     WHERE CfgKey = @CfgKey 
      AND RowStatus = 'A' 
    END 


    IF @@ERROR = 0 
      BEGIN 
        SELECT 'Number of Records Deleted : '+ CAST(@@rowcount AS varchar(10)) 
        COMMIT TRAN; 
       END 
    END TRY 
    BEGIN CATCH 
      SELECT @@ERROR AS ERROR, ERROR_LINE() AS [Error Line], ERROR_MESSAGE() AS [Error Message] 
    ROLLBACK TRAN; 
    END CATCH 

SET NOCOUNT OFF; 
END 

stored procedureが正常に動作します。しかし、sp @@rowcountを実行すると、常に0が返されます。私がerror handlingブロックの上に@@rowcountを置くと、それは1を返します。それはなぜですか?このqueryに構文エラーがありますか?

ありがとうございました

+0

'[dbo]。[ConfigSetting]'には(DELETEの)トリガーがありますか? – gofr1

+3

構文エラーはありません。 '@@ ROWCOUNT'は最後のステートメントの影響を受ける行の数を示しています。そのようなifステートメントの場合は0です。これは、' select * from myTable ; 1 = 1ならば@@ rowcount'を選択します。 1 = 1は行に影響を与えないので、行数は0になります。 – ZLK

+0

トリガーなし@ gofr1 – bmsqldev

答えて

4

このデモを見てください。削除の直後に@@rowcountを保存してください。 ZLKが彼のコメントで述べたように、@@rowcountはIFを含む他のSQL文によってリセットされます。

create table demo (n int); 
insert demo(n) values (1), (2); 
declare @rc int =-1; 

delete from demo where n=1; 
set @rc = @@rowcount; 
if (@@error = 0) -- this will reset @@rowcount 
    select @rc, @@rowcount -- returns 1, 0 
+0

はい、ありがとうございました。 – bmsqldev

関連する問題