SET NOCOUNT升级后处理SQL调用时出错


13

我们正在使用新服务器和Microsoft SQL Server的更新版本升级测试环境,但遇到了问题。

在新服务器上,执行某些存储过程时,我们的旧代码将获得“关闭对象时不允许操作”。该消息从未出现在旧服务器上。当我们对其进行跟踪时,可以通过添加SET NOCOUNT ON;到存储过程中来解决该问题。

我查看了数据库的默认设置,没有发现与默认设置相关的其他设置(SQL Server 2008与SQL Server 2014)。

我应该在什么条件下解决全局问题,而无需增加SET NOCOUNT ON一千个存储过程?


2
所有存储过程都应指定您所依赖的行为,这比依赖用户选项要安全得多。我什至可能会争辩说,每个存储过程都应始终以开头SET NOCOUNT ON;
亚伦·贝特朗

@AaronBertrand我同意;我参与的最后一个项目的模板没有设置计数,但是目前这不是该项目的选项
UnhandledExcepSean

请注意,您可以编写脚本来更改所有存储过程,并SET NOCOUNT ON;在存储过程的开始处(之后BEGIN)附加脚本。存储过程的数量实际上不是问题。
Erik A

1
@ Erik-A-您不能确定存储过程以BEGIN-很好,但不是必需的。
Max Vernon

Answers:


16

SQL Server配置有一个名为的选项,user options可以使用sp_configure系统存储过程进行设置。我在SQL Server Science上写了一篇博客文章,展示了如何检查和设置用户选项。

简而言之,您可以使用以下方法从旧服务器中获取“配置值”:

EXEC sys.sp_configure 'user options';

然后,通过以下方法将新服务器设置为使用相同的选项:

EXEC sys.sp_configure 'user options', <config value>;
RECONFIGURE

(将<config value>替换为旧服务器中的值)。


几乎可以肯定是原因(现在等待确认)。根据MS(docs.microsoft.com/en-us/sql/database-engine/configure-windows/…),旧服务器的值为512,这是NOCOUNT 。我只是在@@ OPTIONS
UnhandledExcepSean

绝对正确。如果SET NOCOUNT ON解决了该问题,则将用户选项设置为512将解决此问题。
Max Vernon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.