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:)