Pet*_*din 4 sql-server ssms sql-server-agent sql-server-2014
我有两个 T-SQL 脚本,它们计划每天运行一次。两者都清理不同表中的一些旧数据。两个脚本都以同一用户身份在同一数据库上运行。
脚本 A 将在 SQL Server Management Studio 和作为作业启动时成功执行,但脚本 B 将仅在 SQL Server Management Studio 中成功执行,即使以设置为在 SQL Server 下运行脚本的同一用户登录代理人。
脚本 B 失败并出现以下错误:
以用户 [username] 身份执行。
DELETE 失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。验证 SET 选项是否正确用于计算列上的索引视图和/或索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。
[SQLSTATE 42000](错误 1934)。步骤失败。
我在尝试清理的表之一上确实有一个过滤索引,但为什么它会通过 SSMS 工作?
Tom*_*m V 13
QUOTED_IDENTIFIER
SSMS 中的默认值ON
是OFF
SQLCMD、OSQL、BCP,在您的情况下尤其是 SQL Server 代理。
作为参考,这些是每个应用程序的不同默认选项
+-------------------------+------------+------+--- ----------------+------------+ | | ADO .Net, | SSMS | SQLCMD、OSQL、BCP | ISQL | | | ODBC | | SQL Server 代理 | 数据库库 | | | OLE 数据库 | | | | +-------------------------+------------+------+--- ----------------+------------+ | ANSI_NULL_DFLT_ON | 开 | 开 | 开 | 关闭 | | ANSI_NULLS | 开 | 开 | 开 | 关闭 | | ANSI_PADDING | 开 | 开 | 开 | 关闭 | | ANSI_警告 | 开 | 开 | 开 | 关闭 | | CONCAT_NULL_YIELDS_NULL | 开 | 开 | 开 | 关闭 | | QUOTED_IDENTIFIER | 开 | 开 | 关闭 | 关闭 | | 阿里萨博特 | 关闭 | 开 | 关闭 | 关闭 | +-------------------------+------------+------+--- ----------------+------------+
上表复制自Erland Sommarskog
因此,您需要将其添加SET QUOTED_IDENTIFIER ON
为作业步骤的第一行。