插入记录时,SET QUOTED IDENTIFIER应为ON

Ram*_*Vel 9 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'..

传递的值是否有问题?

Ram*_*Vel 24

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

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

这是罪魁祸首:默认情况下,QUOTED_IDENTIFIEROFF在SQLCMD模式下运行!

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

注意:我将投票给每个人的帖子都很有用.

  • 你刚刚拯救了我至少一个小时的狩猎 - 我不会猜到SQLCMD正在设置它.感谢您添加此说明 (3认同)
  • 太棒了...我为这个问题挣扎了一个星期..这是一个该死的简单错误..我认为这对某人有用...我很高兴它帮助了你... :) (2认同)

gbn*_*gbn 5

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

为什么?

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

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

创建存储过程时,将捕获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的代码...所以最可能的解决方法是更改​​或重新创建存储过程.