rem*_*rem 8 t-sql sql-server error-handling stored-procedures transactions
如果发生错误,我可以回滚事务:
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
...
Run Code Online (Sandbox Code Playgroud)
但是,如果没有条目在Table1与Col1 = @Param1事务成功提交,这是对我不好.我想检查一下是否Col2 = 'something'真的完成了.如果没有,则使用特定的返回码回滚.
如果我在@@rowcount检查后尝试插入@@error检查,如下所示:
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
...
Run Code Online (Sandbox Code Playgroud)
它总是在这一点上回滚,因为它会@@rowcount计算最后一个语句,所以它总是等于0.
如何在这种情况下检查@@error受影响的行数和行数?
Dam*_*ver 14
在一个查询中将它们存储到您自己的变量中,然后检查:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7616 次 |
| 最近记录: |