考虑以下(半假性代码):
CREATE TABLE foobar (
id INT NOT NULL
message VARCHAR(40) NOT NULL
)
INSERT INTO foobar (1, "hello");
INSERT INTO foobar (2, "world");
my $resultset = "SELECT * FROM foobar";
while(!$resultset->EOF) {
"UPDATE foobar SET message='blah' WHERE id = ".$resultset->id;
$resultset->moveNext;
}
本质上,我试图从表中选择所有记录,然后遍历每个记录,更新几个字段。但是,当我这样做时,我收到以下错误:
[Microsoft] [SQL Server Native Client 10.0] [SQL Server]触发器返回结果集和/或以SET NOCOUNT OFF运行,而另一个未完成的结果集处于活动状态。 (SQL-42000)在continuous.pl第493行。
问题是我没有运行任何触发器。我想也许这是因为我试图更新一个活动的结果集,所以我添加了中间步骤,将所有数据选择到临时表中,然后迭代临时表来更新原始数据,但我仍然得到同样的错误。
任何想法发生了什么?
答案 0 :(得分:1)
我感觉很蠢。我DID在表上有一个触发器,并且DID已将nocount设置为on,但是,在触发器中设置nocount之前只有一行代码,只在极少数情况下运行,并且它恰好运行了时间。修复触发器解决了我的问题。我应该多喝咖啡。
我在循环而不是单个更新语句中执行此操作的原因是因为真正的查询非常复杂(格式很好,大约100行),并且正在更新的数据部分取决于数据中的数据正在更新的行,以及数据库中的其他表。当然,我可能会使用一组聪明的连接,但这是其中一个非常复杂的情况,我宁愿稍后进行优化。