我正在使用Microsoft的SQL Server 2008r2(服务器版本的选择由客户决定)。
注意,在每次测试之前我都会运行:
UPDATE apps set AssetId = NULL;
使用Microsoft SQL Server Management Studio我运行以下查询:
UPDATE apps set AssetId=1 WHERE id=1;
UPDATE apps set AssetId=1 WHERE id=2;
UPDATE apps set AssetId=1 WHERE id=3;
UPDATE apps set AssetId=1 WHERE id=4;
UPDATE apps set AssetId=1 WHERE id=5;
UPDATE apps set AssetId=1 WHERE id=6;
UPDATE apps set AssetId=1 WHERE id=7;
...查询运行没有错误,并且正如预期的那样返回7:
select count(*) from apps where AssetId=1;
到目前为止一切顺利。
现在我将所有AssetIds设置为NULL,然后从VB6二进制文件运行相同的查询。我将所有7个查询存储在单个字符串变量中,并使用ADO Recordset对象执行它们。我检查SQL分析器并观察所有查询是否出现在SQL:BathStarting EventClass中。没有错误(我选择在设置探查器时显示所有错误和警告)。然而这又回归4:
select count(*) from apps where AssetId = 1;
-- Only 4 records have an AssetId which is not null:
select id, AssetId from apps where AssetId = 1;
select id, AssetId from apps where AssetId is not null;
我重新安排了UPDATE语句,再次为所有行设置AssetId为null,然后运行update语句。仍然只有4行得到更新(与批处理中前4个更新语句对应的行)。
为什么只运行7批中的前4个语句?在同一服务器实例上使用相同的数据库时,为什么ADO Recordset和Microsoft SQL Server Management Studio对完全相同的查询会有不同的结果?
看起来ADO Recordset几乎可以在一个批处理中运行最大数量的更新语句(即使分析器看到批处理中的所有7个)。
[补充资料] 我已经更改了探查器字段输出,并使用相同的查询,我现在看到了不同的行为。以前只有4行更新,但是,在探查器中,SQL:BatchingStarting显示所有7个分号分隔的字段,但7个语句中只有4个具有SQL:StmtStarting“EventClass记录(3个查询未在所有的分析器)。像以前一样,我检查了所有的错误/警告。我很确定在我看到一个SQL:StmtStarting为批处理中的每个查询。
答案 0 :(得分:0)
我找到了解决方案。我不得不禁用名为&#34的高级选项;禁止触发器的结果"。启用此选项后,即使您的触发器没有返回记录集,也会导致批处理不执行所有语句,并且似乎没有错误或警告。
我跑了这个:
sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE ;
GO
EXEC sp_configure 'disallow results from triggers', '1';
RECONFIGURE;
...完成此操作后,我的事务中的所有UPDATE语句都已完成。
我想或许可以通过显示高级选项'设置为0(SQL Server 2008的默认值)批处理正在累积警告消息:
从a中删除从触发器返回结果的功能 SQL Server的未来版本。避免在新版本中使用此功能 开发工作,并计划修改当前使用的应用程序 它
我怀疑在X中累积了很多这些后,服务器停止在批处理中执行语句,没有给出错误,批处理被标记为已完成。