什么是SQL Server SET NOCOUNT ON的DB2等价物?

时间:2013-07-24 08:56:14

标签: sql sql-server db2

SQL Server的SET NOCOUNT ON的DB2等价物是什么?

“来自SQL Server文档:

SET NOCOUNT ON ...停止显示受Transact-SQL语句或存储过程影响的行数计数的消息作为结果集的一部分返回...

对于包含多个不返回大量实际数据的语句的存储过程,或者对于包含Transact-SQL循环的过程,将SET NOCOUNT设置为ON可以显着提高性能,因为网络流量大大减少。“

我的问题是如果我更新表中的一行,则触发器会运行更新另一行 在另一张表中的行。

在Hibernate中我收到此错误:“批量更新返回意外行 从更新开始计算;实际行数:2;预期:1“。

我认为因为触发器DB2返回2而不是1,什么 是正确的。但是,有没有办法让DB2返回1 没有删除触发器或我可以禁用Hibernate检查? 如何处理这个问题? 任何人都可以在db2中告诉“Set NoCount on”(sql server)等效吗?

1 个答案:

答案 0 :(得分:1)

DB2中没有等效的SET NOCOUNT,因为DB2在DML语句成功完成后不会产生任何信息性消息。相反,DB2驱动程序将该类型的信息存储在称为SQL communications area (SQLCA)的本地特定于连接的数据结构中。应用程序(或应用程序正在使用的任何数据库框架或API)决定在执行每个语句后要检查哪些SQLCA变量。

在您的情况下,您的应用程序已将其数据库交互委派给Hibernate,后者将SQLCA中DB2报告的受影响行数与Hibernate期望其UPDATE语句更改的行数进行比较。由于Hibernate不知道您创建的AFTER UPDATE触发器,因此它期望update语句只影响一行,但SQLCA显示两行已更新(一行是Hibernate的更新语句,另一行是AFTER UPDATE触发器)表),所以Hibernate抛出异常来抱怨差异。

这为您提供了两个选项:

  1. 从该表中删除触发器,而是在Hibernate中定义一个等效的后续操作。如果其他不使用Hibernate的应用程序也在更新相关表格,这不是一个理想的解决方案,但这是团队在数据库上造成Hibernate时所做出的决定。
  2. 将AFTER UPDATE触发器保持在DB2中的位置,并检查用于定义Hibernate对象映射的选项,以确定是否有办法至少暂时禁用Hibernate的行计数验证逻辑。一种看起来特别令人鼓舞的方法是将ResultCheckStyle.NONE选项指定为自定义@SQLUpdate annotation的一部分。
  3. 对于SQL Server和Sybase,似乎有第三种选择:通过激活触发器中的SET NOCOUNT ON来隐藏来自Hibernate的AFTER UPDATE触发器的活动。不幸的是,在DB2(或Oracle,就此而言)中没有等价物允许应用程序在计算受影响的行数时有选择地跳过某些活动。