【发布时间】: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_modules 的SELECT 语句显示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 的语句
标签: sql-server sql-server-2008 quoted-identifier