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_IDENTIFIER
和SET ANSI_NULLS
在存储 Transact-SQL 时 创建或修改程序。 这些原始设置用于 存储过程被执行。 因此,任何客户端会话设置 对于SET QUOTED_IDENTIFIER
和SET ANSI_NULLS
在存储时被忽略 程序正在运行。其他套装 选项,例如 SET ARITHABORT、SET ANSI_WARNINGS,或设置ANSI_PADDINGS
存储过程时不保存 被创建或修改。
【讨论】:
以上是关于SQL Server 存储过程因使用 XML/ANSI_NULLS、QUOTED_IDENTIFIER 选项而失败的主要内容,如果未能解决你的问题,请参考以下文章