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

问题描述 投票:0回答:1

我正在使用Microsoft的SQL Server 2008 R2(服务器版本的选择由客户决定。

注意,在每次测试之前,我都要运行此:

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:BatchStarting 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。

sql-server-2008
1个回答
0
投票

我找到了解决方案。我不得不禁用名为“禁止触发器结果”的高级选项。启用此选项后,即使您的触发器不返回记录集,它也会导致批处理不执行所有语句,并且似乎不给出任何错误或警告。

我跑了这个:

sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE ;
GO

EXEC sp_configure 'disallow results from triggers', '1';
RECONFIGURE;

...完成此操作后,我的事务中的所有UPDATE语句现在完成。

我认为也许'show advanced options'设置为0(SQL Server 2008的默认值),该批处理正在累积警告消息:

从触发器返回结果的功能将在SQL Server的未来版本。避免在新功能中使用此功能开发工作,并计划修改当前使用的应用程序它。

我怀疑在累积了X个之后,服务器将停止在批处理中执行语句,没有给出错误,并且批处理被标记为已完成。

© www.soinside.com 2019 - 2024. All rights reserved.