7

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

    --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,但我还没有做到这一点。

4

3 回答 3

12

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

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

甚至像PRINTs 这样的简单语句也会导致@@ROWCOUNT分配一个新值(在本例中为 0)

于 2013-08-23T14:47:19.430 回答
2

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

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

这会导致下一行(UPDATE 语句)总是失败。

于 2013-08-22T23:37:05.423 回答
0

我在其中的 PRINT 语句仅用于开发,我计划在整个过程中删除它们。所以我把它们拿出来,SELECT INTO 和 UPDATE 语句工作正常,但 DROP 语句都没有工作。

我的代码顶部的 DROP table 语句和我添加的语句是这样的:

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

IF @@ROWCOUNT > 0 COMMIT TRAN

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

于 2013-08-23T14:17:28.713 回答