我正在尝试在事务中包含一些操作,以便我可以确定是否应该在最后一步中删除一个表。这是我到目前为止所做的:
--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但是我还没有那么远。
答案 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语句然后运行整个过程,我不会得到任何类型的错误,只是按照我预期的那样更新表然后停止。