我陷入了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'..
传递的值是否有问题?
答案 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,索引视图或索引?