SQL Server 存储过程因使用 XML/ANSI_NULLS、QUOTED_IDENTIFIER 选项而失败

Posted

技术标签:

【中文标题】SQL Server 存储过程因使用 XML/ANSI_NULLS、QUOTED_IDENTIFIER 选项而失败【英文标题】:SQL Server Stored Procedure Fails due to use of XML/ ANSI_NULLS, QUOTED_IDENTIFIER options 【发布时间】:2009-11-11 09:08:54 【问题描述】:

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

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】:

在 CREATE 或 ALTER 时应用的设置并在运行时被忽略。

SSMS 默认设置正确(sqlcmd、osql 等也是如此)。

来自BOL, CREATE PROC, "Using SET Options"

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

【讨论】:

以上是关于SQL Server 存储过程因使用 XML/ANSI_NULLS、QUOTED_IDENTIFIER 选项而失败的主要内容,如果未能解决你的问题,请参考以下文章

sql server中怎样创建保存数据的存储过程

SQL Server存储过程的使用

SQL Server 存储过程

SQL Server存储过程(数据库引擎)使用详解

SQL Server基础之存储过程

使用存储过程将记录从 SQL Server 复制到 SQL Server (2005)