Sql 存储过程不';t在异常处理后返回受影响的行

Sql 存储过程不';t在异常处理后返回受影响的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在存储过程中添加了异常处理,如下所示 ALTER PROCEDURE [dbo].[BUDGETUPDATE] @DistrictID int AS BEGIN SET NOCOUNT ON ; BEGIN TRY BEGIN TRAN UPDATE bud SET bud.BudgetStateID = @BudgetStateID

我在存储过程中添加了异常处理,如下所示

ALTER PROCEDURE [dbo].[BUDGETUPDATE] 
 @DistrictID        int
AS
BEGIN
 SET NOCOUNT ON ;

 BEGIN TRY
         BEGIN TRAN
                    UPDATE bud
                    SET bud.BudgetStateID    = @BudgetStateID
                    FROM [dbo].[BudgetOffice] bud
                        INNER JOIN [dbo].[vw_Office] vw
                            ON (vw.OfficeID   = bud.OfficeID)
                        WHERE   vw.DistrictID = @DistrictID
         IF @@ERROR = 0
      BEGIN   
          COMMIT TRAN;
          SELECT @@ROWCOUNT AS AffectedRow;
      END
 END TRY
 BEGIN CATCH
           SELECT @@ERROR AS ERROR
 ROLLBACK TRAN;
 END CATCH

 SET NOCOUNT OFF ;

 END

我需要使用
@@ROWCOUNT
返回受影响的行数。但是这个
存储过程总是将rowcount返回为0。任何理由。是否需要在
更新之后立即编写
@@rowcount
语句

在您的
UPDATE
语句之后,需要选择
@@ROWCOUNT
。根据:

语句,如USE、SET、DEALLOCATE CURSOR、CLOSE CURSOR、, BEGIN TRANSACTION或COMMIT TRANSACTION将ROWCOUNT值重置为0


由于您的
@@ROWCOUNT
COMMIT TRAN
之后,
@@ROWCOUNT
返回0。

您需要将全局变量的结果存储在局部变量中,因为它会在下一条指令后更改,如:

ALTER PROCEDURE [dbo].[BUDGETUPDATE] 
 @DistrictID        int
AS
BEGIN
 SET NOCOUNT ON ;
 DECLARE @rowcount INT, @error INT;

 BEGIN TRY
         BEGIN TRAN
                    UPDATE bud
                    SET bud.BudgetStateID = @BudgetStateID
                    FROM [dbo].[BudgetOffice] bud
                    JOIN [dbo].[vw_Office] vw
                      ON vw.OfficeID   = bud.OfficeID
                    WHERE vw.DistrictID = @DistrictID;

      SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;

      IF @error = 0
      BEGIN   
          COMMIT TRAN;
          SELECT @rowcount AS AffectedRow;
      END

 END TRY
 BEGIN CATCH
     SELECT @@ERROR AS ERROR
     ROLLBACK TRAN;
 END CATCH
 END
或者更好的方法是在
TRY CATCH
块中使用
@@ERROR

ALTER PROCEDURE [dbo].[BUDGETUPDATE] 
 @DistrictID        int
AS
BEGIN
 SET NOCOUNT ON ;

 BEGIN TRY
    BEGIN TRAN
           UPDATE bud
           SET bud.BudgetStateID = @BudgetStateID
           FROM [dbo].[BudgetOffice] bud
           JOIN [dbo].[vw_Office] vw
             ON vw.OfficeID   = bud.OfficeID
           WHERE vw.DistrictID = @DistrictID;

           SELECT @@ROWCOUNT AS AffectedRow;

    COMMIT TRAN; 
 END TRY
 BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ERROR
    ROLLBACK TRAN;
 END CATCH
 END

@BudgetStateID
在哪里定义?

我想在
更新之后,您需要选择
@@rowcount
。我将代码的一部分用于演示。忘记在输入参数列表中添加@budgetstatid:)