由于使用了XML/ANSI_NULLS、QUOTED_IDENTIFIER选项,SQL Server存储过程失败

7

我有一个存储过程,它接收一个XML参数并将数据插入到多个表中。如果我在数据库中使用SSMS查询窗口运行存储过程,一切都正常。然而,我们有一个自定义安装程序用于部署存储过程到数据库,当使用此程序时,执行存储过程会失败,并出现以下错误:

INSERT failed because the following SET options have incorrect settings:
'ANSI_NULLS, QUOTED_IDENTIFIER'. Verify that SET options are correct for use with
indexed views and/or indexes on computed columns and/or query notifications 
and/or xml data type methods.

在存储过程中编写脚本时,自定义安装程序未使用正确的设置。

在sp中设置这些(SET ARITHABORT ON; SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON;)没有效果:

我也尝试在代码中调用sp之前为开放连接设置这些选项。这同样没有预期效果。

似乎在运行到数据库中的sp时,与数据库的连接上的设置是最重要的,而不是使用sp时的设置。

我已经在SSMS选项中尝试了这些设置,并且似乎确实如此。我只想确认这肯定是事实(如果有解决方法,我很乐意听取,但我并不抱太大希望)

不幸的是,目前对安装程序进行更改不是我的选择,因此我正在考虑回滚几周的工作;因此,如果我必须这样做,我希望非常确定(并有一些证据支持),这是唯一的选择。

1个回答

11

这些设置是在创建或修改时应用的,并在运行时忽略。

SSMS默认情况下具有正确的设置(sqlcmd、osql等也是如此)。

来自BOL,CREATE PROC,“使用SET选项”

当创建或修改Transact-SQL存储过程时,数据库引擎会保存SET QUOTED_IDENTIFIERSET ANSI_NULLS的设置。这些原始设置将在执行存储过程时使用。因此,在运行存储过程时,将忽略任何客户端会话设置为SET QUOTED_IDENTIFIERSET ANSI_NULLS的设置。其他的SET选项,例如SET ARITHABORT,SET ANSI_WARNINGS或SET ANSI_PADDINGS在创建或修改存储过程时不会被保存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接