我正在根据提前确定的参数运行一组迭代 SQL 查询。执行此 .sql 脚本中的每组查询并将行插入到临时表中。我想做的是在将一行插入临时表后停止其余语句的执行。为此,我在每次插入后检查@@ROWCOUNT 值。如果它是 0,那么我继续执行下一个 INSERT 语句。如果它是 <> 0 那么我想停止。我看到一些有趣的效果,我想知道当我检查它时 @@ROWCOUNT 是否被更改。这是一个基本示例:
create #temptable
INSERT INTO #temptable (...) SELECT a,b..,n FROM TABLE1 where param1=x1 and param2=x2
IF @@ROWCOUNT = 0
INSERT INTO #temptable (...) SELECT a,b..,n FROM TABLE1 where param1=y1 and param2=x2
IF @@ROWCOUNT = 0
INSERT INTO #temptable (...) SELECT a,b..,n FROM TABLE1 where param1=z1 and param2=x2
IF @@ROWCOUNT = 0
INSERT INTO #temptable (...) SELECT a,b..,n FROM TABLE1 where param1=x1 and param2=y2
IF @@ROWCOUNT = 0
INSERT INTO #temptable (...) SELECT a,b..,n FROM TABLE1 where param1=y1 and param2=y2
IF @@ROWCOUNT = 0
INSERT INTO #temptable (...) SELECT a,b..,n FROM TABLE1 where param1=z1 and param2=y2
Run Code Online (Sandbox Code Playgroud)
我看到的是,当第一个 INSERT 有行时,它不会执行第二个 INSERT,但会执行第三个。然后,它不会执行第四个 INSERT,但会执行第五个 INSERT,等等。它是否应该停止所有进一步的执行,或者是否有某些范围正在更改?
有没有办法在 INSERT 语句将一行插入临时表后停止此 SQL?
@@ROWCOUNT每个执行的语句(包括 IF 语句)都会重置;这就是为什么当您关心它时,您通常做的第一件事就是将其捕获到一个变量中,以便您可以随后使用该值执行操作,而不必担心它已更改。
更新(真的是无耻的自我推销):如果你想看到你的 SQL 自动拆分成语句(所以在这里你会看到每个 IF/INSERT 组合构成一个语句),你可以通过 SQL 格式化程序(如我的PoorSQL)将其传递.com网站 - 它将在语句之间放置一个空行!:)
另外:关于如何处理此问题的快速概述,也适用于@@ERROR:http://www.novicksoftware.com/TipsAndTricks/sql-error-reset-after-every-statement.htm(尽管在 SQL 2005 及更高版本中)你真的应该使用 try/catch 而不是@@ERROR)
| 归档时间: |
|
| 查看次数: |
9050 次 |
| 最近记录: |