由于以下SET选项设置不正确,因此插入失败:'QUOTED_IDENTIFIER'。

40
有时在执行存储过程时,我们会收到以下消息,然后在没有任何更改的情况下删除并重新执行存储过程,它可以正常工作。
“DBCORE INSERT”失败,因为以下SET选项设置不正确:“QUOTED_IDENTIFIER”。请验证SET选项是否正确用于具有索引视图和/或计算列上的索引和/或过滤索引和/或查询通知和/或XML数据类型方法和/或空间索引操作。
请帮助我们理解这个问题。
6个回答

41

QUOTED_IDENTIFIER 是一个“粘性”选项,因此运行时会使用创建存储过程时有效的设置。由于没有进行过存储过程更改,所以该错误表明存储过程是使用 QUOTED_IDENTIFIER OFF 创建的,并且创建或删除了一种错误消息中提到的索引类型之一。

为避免今后出现问题,请在同时启用 QUOTED_IDENTIFIER ONANSI_NULLS ON 的会话中重新创建或更改存储过程。

编辑:

根据 @Leonidius 的答案及相关评论,SQLCMD 命令行实用程序默认情况下启用 QUOTED_IDENTIFIER OFF 以保持向后兼容性。这种行为与 SSMS 不同,当部署脚本没有明确包含 QUOTED_IDENTIFIER ON 语句来创建存储过程和其他对象时,这是一个常见的陷阱。

我强烈建议将 -I SQLCMD 参数指定为习惯,以确保不会意外地设置 QUOTED_IDENTIFIER OFF


28

在我的情况下,当以批量模式加载存储过程时,我需要在sqlcmd.exe命令行中添加-I参数。


8
SQLCMD默认为了向后兼容而使用QUOTED_IDENTIFIER OFF,因此在执行的脚本中创建存储过程之前不包含QUOTED_IDENTIFIER ON时,需要使用-I选项。 - Dan Guzman
3
我的 bcp 版本没有 "-I",但是添加 "-q" 就解决了问题。 - Brad
哦,我的天啊!谢谢,我找了好几天这个。 - Stav Shamir

16

我遇到了这个问题,所以我将所有的工作步骤都创建为 MS SQL 中的存储过程。在使用模板时,它会自动包含以下内容。

GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON

8
如果您在通过Visual Studio数据库项目部署后遇到此错误,则值得检查存储过程文件的属性。 如果设置为“项目默认值”,则转到数据库项目的属性>项目设置并单击“数据库设置”按钮。
您可以像下面的屏幕截图中所示将这两个值(以及其他值)默认启用。

enter image description here

如果您对存储过程进行了更改,则此方法仅能解决问题;但是,模式比较和随后的更新将不会更改存储过程中的QUOTED_IDENTIFIER,除非存储过程主体发生更改。它将防止在随后的模式更新中再次出现该问题。


1
或者在 .sqlproj 文件中像这样更改存储过程的设置:<Build Include="StoredProcedures\MyStoredProc.sql"><QuotedIdentifier>On</QuotedIdentifier><AnsiNulls>On</AnsiNulls></Build> - eddex

0
我遇到的问题虽然出现了相同的错误信息,但实际上是由于 BEGIN TRANSACTION 声明的位置不正确导致的。 enter image description here

0

我在一个 SQL Job 步骤中遇到了同样的问题,因为我试图设置一个名为 Status 的列。所以在顶部我添加了以下代码:

GO SET QUOTED_IDENTIFIER ON GO

并且在我的 SET 语句中,我给我的 Status 列添加了双引号。

UPDATE QES.dbo.WDQ894_IdsToProcess SET "Status" = 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接