SP 执行时 SQL Server 2008 中的 QUOTED IDENTIFIER 错误

Posted

技术标签:

【中文标题】SP 执行时 SQL Server 2008 中的 QUOTED IDENTIFIER 错误【英文标题】:QUOTED IDENTIFIER error in SQL Server 2008 on SP execution 【发布时间】:2014-01-20 00:17:26 【问题描述】:

执行存储过程时出现此错误:

插入失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。验证 SET 选项是否适用于索引视图和/或计算列上的索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。

创建过程时将QUOTED_IDENTIFIER 标志设置为ON

IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE OBJECT_ID = OBJECT_ID(N'sp_procedure') AND TYPE IN (N'P', N'PC'))
  BEGIN
    DROP PROCEDURE  [dbo].[sp_procedure]
  END
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_procedure]
(   
     @param_1 XML
    ,@param_2 INT
)
AS
BEGIN
   -- CODE
END

来自sys.sql_modulesSELECT 语句显示uses_quoted_identifiers 以某种方式设置为0

我已经尝试执行以下代码。它在one batch 中运行。

SET QUOTED_IDENTIFIER ON; 
EXEC sp_procedure @param_1 = N'<?xml version="1.0" encoding="utf-16"?>
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" />', @param_2= 51326

但这无济于事。

每个会话都是在 QUOTED_IDENTIFIER 设置为 1 的情况下创建的:

set quoted_identifier on 
set arithabort off 
set numeric_roundabort off
set ansi_warnings on

有什么想法吗?

UPD 原来,在运行这个特定的脚本之后,还运行了很多其他文件。其中一个刚刚重新创建了将 QUOTED_IDENTIFIER 设置为 OFF 的存储过程。

感谢您的帮助

【问题讨论】:

命令成功完成。 关于您的复制的一些事情是不正确的。它成功了。你能发布一个我可以在 tempdb 中运行的完整重现吗? 在这里也能成功运行。 希望这只是一个虚构的名称,但您应该避免在存储过程的名称中使用 sp_ 前缀。 @usr,我希望我能 不幸的是,代码与非常大的数据库紧密耦合。我知道这个简单的例子会成功。我宁愿需要一个提示,比如 SQL Server 属性(顺便说一下,QUOTED_IDENTIFIER 在那里设置为 ON),或者我错过了一些东西。 Profiler 显示没有关闭 QUOTED IDENTIFIER 的语句 【参考方案1】:

请确保表和视图定义也是使用带引号的标识符创建的。

【讨论】:

以上是关于SP 执行时 SQL Server 2008 中的 QUOTED IDENTIFIER 错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 R2执行存储过程sp_MailItemResultSets引起大量PREEMPTIVE_OS_WAITFORSINGLEOBJEC等待

sql server 2008,SP_OACreate手动执行成功,代理作业定时执行失败?

windows server 2008 R2 SP1 安装SQL Server 2008 R2时提示 "此操作系统不支持此版本的 SQL Server 版本"

sqlserver 2008 的跟踪器-sql server profiler,里面的内嵌视图exec sp_prepexec @p1 output

升级到 SQL Server Express 2008 SP2 的问题

求解!安装SQL server 2008的时候出现这个是啥原因