脚本无法作为 SQL Server 代理作业运行,从 SSMS 运行时成功完成

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_IDENTIFIERSSMS 中的默认值ONOFFSQLCMD、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为作业步骤的第一行。