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

时间:2009-11-11 09:08:54

标签: sql sql-server xml tsql stored-procedures

我有一个存储过程,它接受一个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之前尝试为open连接设置这些选项。这再次没有达到预期的效果。

当sp正在运行到数据库时,与数据库连接的设置似乎是重要的,使用sp时的设置

我已经通过在SSMS选项中使用这些设置进行了实验,这似乎就是这种情况。 我希望有人确认这是绝对的情况(如果有一种方法我会喜欢听到它,但我没有希望)

不幸的是,改变安装程序对我来说当前不是一个选择,所以我期待不得不回滚几周的工作;所以,如果我必须这样做,我想确定(并有一些证据支持我),这是唯一的选择

1 个答案:

答案 0 :(得分:11)

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

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

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

  

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