我在我的存储过程中添加了异常处理,如下所示。
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
返回受影响的行数。但是这个stored procedure
总是返回rowcount为0。有什么原因吗?我需要把@@rowcount
的表述写在update
的后面吗?
您需要在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
在哪里定义?