2013-07-24 64 views
1

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

“从SQL Server文档:

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

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

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

在休眠我得到这个错误:“批量更新返回意外行 计数从更新;实际行数:2;预计:1”。

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

+1

您能否给我们一个输出示例,显示DB2中已修改的行?这只是因为我不知道通过减少网络流量是什么意思。你能给出明确的DB2和SQL服务器的例子吗? – AngocA

回答

1

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

就你而言,你的应用程序已经将它的数据库交互委托给Hibernate,它将SQLCA中DB2报告的受影响行的数量与Hibernate预计其UPDATE语句更改的行数进行比较。由于Hibernate没有意识到你创建的AFTER UPDATE触发器,它期望update语句只影响一行,但是SQLCA显示两行已被更新(一个是Hibernate的更新语句,另一个是AFTER UPDATE触发器)表),所以Hibernate会抛出一个异常来抱怨差异。

这使你有两个选择:

  1. 删除触发器从该表中,而是定义在H​​ibernate中的等价后续行动。如果其他没有使用Hibernate的应用程序也在更新有问题的表,那么这不是一个理想的解决方案,但这是团队在数据库中施加Hibernate时所做的决定。
  2. 将AFTER UPDATE触发器保留在DB2中,并检查用于定义Hibernate对象映射的选项,以确定是否有办法至少暂时禁用Hibernate的行计数验证逻辑。看起来特别令人鼓舞的一种方法是将ResultCheckStyle.NONE选项指定为定制@SQLUpdate annotation的一部分。

对于SQL Server和Sybase,似乎有第三种选择:通过在触发器中激活SET NOCOUNT ON来隐藏AFTER UPDATE触发器从休眠状态的活动。不幸的是,在DB2(或Oracle)中没有相应的功能,允许应用程序在统计受影响的行数时选择性地跳过某些活动。

相关问题