MSSQL并非批处理中的所有语句都被执行

时间:2017-05-19 16:46:29

标签: sql-server-2008

我正在使用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为批处理中的每个查询。

1 个答案:

答案 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中累积了很多这些后,服务器停止在批处理中执行语句,没有给出错误,批处理被标记为已完成。