1

考虑以下(半伪代码):

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 行。

问题是我没有运行任何触发器。我认为这可能是因为我正在尝试更新活动结果集,所以我添加了将所有数据选择到临时表中的中间步骤,然后遍历临时表以更新原始表,但我仍然得到同样的错误。

有什么想法吗?

4

1 回答 1

1

嗯,我觉得很愚蠢。我确实在桌子上有一个触发器,它确实将 nocount 设置为 on,但是,在触发器中设置 nocount on 之前,有一行代码仅在极少数情况下运行,而它恰好运行这个时间。修复触发器解决了我的问题。我应该多喝点咖啡。

我在循环而不是单个更新语句中执行此操作的原因是因为真正的查询非常复杂(格式很好,大约 100 行),并且正在更新的数据部分依赖于正在更新的行中的数据,以及数据库中的其他表。当然,我可能会使用一组巧妙的连接,但这是其中一种情况,因为它非常复杂,我更愿意稍后进行优化。

于 2013-01-09T16:00:26.967 回答