10

我遇到了 SQL Server 2005 的一个相当奇怪的问题,它抛出

“插入记录时应启用 SET QUOTED IDENTIFIER”

(用作 SP)到特定的表。这之前工作得很好,但是随机抛出这个错误。

我已经验证了SP。我们没有在里面手动指定 SET QUOTED IDENTIFIER 设置,所以默认必须是 ON。

有人可以澄清可能是什么问题吗?

必须使用 SET QUOTED IDENTIFIER ON 创建表吗?我还没有检查表格脚本。

我观察到此问题仅发生在 SP 对日期列 (modifiedAt) 执行插入或更新时...示例值为 '2009-08-10 06:43:59:447'..

传递的值有问题吗?

4

4 回答 4

26

After a long struggle we were able to fix this problem. I just wanted to share the reason.

Our build team maintains a separate in-house tool to deploy scripts, which internally triggers the SQLCMD (shell) utility to execute T-SQL scripts in a db.

Here is the culprit: by default, QUOTED_IDENTIFIER is OFF when running in SQLCMD mode!

Every script run through this tool is created with QUOTED IDENTIFIER OFF. We are the only module which uses indexed views. All the remaining stories you know well in my previous posts :(

NOTE: I am going to vote everyone's post as useful.

于 2009-08-12T12:02:58.393 回答
5

编写存储过程的脚本,确保/更改 SET 选项,运行 ALTER PROC 以确保设置了 SET QUOTED IDENTIFIER ON。

为什么?

“SET QUOTED IDENTIFIER”的设置是在创建存储过程时定义的,并且对于表始终为“ON”。来源,BOL

创建表时,QUOTED IDENTIFIER 选项始终在表的元数据中存储为 ON,即使在创建表时该选项设置为 OFF。

创建存储过程时,会捕获 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置并将其用于该存储过程的后续调用。

可以在服务器级别 (sp_configure 'user options') 或数据库级别 (ALTER DATABASE) 定义连接的默认值。对于 SSMS,它位于“Tools..Options..Query Execution..SQL Server..ANSI”下。它也是客户端库的默认设置(DB-LIb 除外)。

现在,您打开一个 SSMS 查询窗口并开始输入“CREATE PROC..”,然后在您运行代码时它使用 SSMS 设置。

并且 SET QUOTED IDENTIFIER不能在运行时在存储过程中设置。在你不同意之前给我看一个参考......来自上面的 MS BOL 链接:

在存储过程中执行时,不会更改 SET QUOTED_IDENTIFIER 的设置。

您必须努力工作以关闭此功能来运行任何代码......所以最有可能的解决方法是更改​​或重新创建存储的过程。

于 2009-07-16T14:22:36.427 回答
1

在 SQL Server 2005 中,SET QUOTED IDENTIFIER 默认为 OFF,而不是 ON(除非使用 ODBC 或 OLE 连接...有关详细信息,请参阅内容)。

您无需使用 SET QUOTED IDENTIFIER ON 创建表即可使用它。

您需要做的就是将 SET QUOTED IDENTIFIER ON 添加到您的 SP 的开头,以启用它以运行该过程(并确保如果您不想让它打开,您已经 SET QUOTED IDENTIFIER OFF 来切换回来了)。

编辑

我站得更正了。根据此MSDN Page, SET QUOTED IDENTIFIER 默认为 ON(除非与 DB-Library 应用程序连接。

于 2009-07-16T14:11:17.760 回答
1

我刚刚阅读了 Erland Sommarskog 的这篇文章,动态 SQL 的诅咒和祝福,它包括以下关于 SET QUOTED IDENTIFIER 设置的段落:

此设置的默认值取决于上下文,但首选设置为 ON,并且它必须为 ON 才能使用 XQuery、索引视图和计算列上的索引。

您的存储过程是否使用 XQuery、索引视图或计算列上的索引?

于 2009-07-16T14:15:38.670 回答