在@@ ROWCOUNT上提交tran

时间:2013-08-22 22:51:32

标签: sql transactions

我正在尝试在事务中包含一些操作,以便我可以确定是否应该在最后一步中删除一个表。这是我到目前为止所做的:

    --select the DB
    use DB1


    --if the table exists, we want to delete it first
    IF (EXISTS (SELECT * 
                     FROM INFORMATION_SCHEMA.TABLES 
                     WHERE TABLE_SCHEMA = 'dbo' 
                     AND  TABLE_NAME = 'VV'))
    BEGIN
        drop table dbo.VV
    END

BEGIN TRAN  

    SELECT field1
          ,field2
          ,field3

    INTO dbo.vv
      FROM vvr A
     WHERE A.field1 <> 'GEN'
     AND A.field2 <> 'NO DATA'
     AND A.field3 <> '(BLANK) NO'

PRINT 'ROW1:' +  CAST(@@ROWCOUNT as varchar(11))
IF @@ROWCOUNT = 0 
        ROLLBACK TRAN 
    ELSE
        COMMIT TRAN


    UPDATE dbo.vv 
    SET dbo.field1 = vvr.field1
    FROM dbo.vv

PRINT 'ROW2:' +  CAST(@@ROWCOUNT as varchar(11))

IF @@ROWCOUNT = 0 
        ROLLBACK TRAN 
    ELSE
        COMMIT TRAN

当我在没有事务语句的情况下运行它时,它运行得很好,所以我知道SQL有效,但是当我添加事务语句时,它无法告诉我表VV不存在。当我选择VV时,肯定不见了。

一旦我完成上述操作就可以了,我会在最后添加一个语句来删除表vvr但是我还没有那么远。

3 个答案:

答案 0 :(得分:10)

如果要根据单个语句影响的行数执行多个操作,则需要立即将该值捕获到您自己的变量中:

DECLARE @rc int
SELECT field1
      ,field2
      ,field3

INTO dbo.vv
  FROM vvr A
 WHERE A.field1 <> 'GEN'
 AND A.field2 <> 'NO DATA'
 AND A.field3 <> '(BLANK) NO'

 SET @rc = @@ROWCOUNT
PRINT 'ROW1:' +  CAST(@rc as varchar(11))
IF @rc = 0 
    ROLLBACK TRAN 
ELSE
    COMMIT TRAN

即使像PRINT这样的简单语句也会为@@ROWCOUNT分配一个新值(在本例中为0)

答案 1 :(得分:2)

PRINT 'ROW1:' + CAST(@@ROWCOUNT as varchar(11))

此行重置@@ ROWCOUNT。如果在表中插入50条记录,则print语句将返回50,但是当您在下一行中引用@@ ROWCOUNT时,该值将返回0,因此,因为执行回滚操作,该表将永远不存在

然后导致下一行(UPDATE语句)始终失败。

答案 2 :(得分:0)

我在那里的PRINT语句只是用于开发,我计划在它一直运行时删除它们。所以我把它们拿出来了,SELECT INTO和UPDATE语句工作正常,但没有DROP语句有效。

我的代码顶部的DROP表语句和我添加的语句是:

IF @@ROWCOUNT > 0 
BEGIN
    drop table dbo.VVR
END

IF @@ROWCOUNT > 0 COMMIT TRAN

如果我在顶部运行DROP TABLE语句然后运行整个过程,我不会得到任何类型的错误,只是按照我预期的那样更新表然后停止。