插入记录时,SET QUOTED_IDENTIFIER应为ON

时间:2009-07-16 14:03:20

标签: sql-server sqlcmd

我陷入了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 个答案:

答案 0 :(得分:24)

经过长期的斗争,我们能够解决这个问题。我只想分享原因。

我们的构建团队维护一个单独的内部工具来部署脚本,该工具在内部触发 SQLCMD (shell)实用程序以在db中执行T-SQL脚本。

以下是罪魁祸首:默认情况下,QUOTED_IDENTIFIER在SQLCMD模式下运行时为OFF

通过此工具运行的每个脚本都是使用QUOTED IDENTIFIER OFF创建的。我们是唯一使用索引视图的模块。您在之前的帖子中熟悉的所有剩余故事:(

注意:我打算将每个人的帖子投票为有用。

答案 1 :(得分:5)

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

<强>为什么吗

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

  

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

     

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

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

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

SET QUOTED IDENTIFIER 无法 在存储过程中的运行时设置。在你不同意之前告诉我一个参考...从上面的MS BOL链接:

  

在存储中执行时   程序,SET的设置   QUOTED_IDENTIFIER未更改。

你必须努力运行任何带有此OFF的代码...所以最可能的解决方法是更改​​或重新创建存储过程。

答案 2 :(得分:1)

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

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

您需要做的就是在SP的开头添加SET QUOTED IDENTIFIER ON以启用程序运行(并确保如果您不希望将其保留,请使用SET QUOTED IDENTIFIER关闭以将其切换回来。)

修改

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

答案 3 :(得分:1)

我刚刚阅读了Erland Sommarskog撰写的这篇文章,The Curse and Blessings of Dynamic SQL,其中包含以下有关SET QUOTED IDENTIFIER设置的段落:

  

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

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