web-dev-qa-db-ja.com

スクリプトはSQL Serverエージェントジョブとして実行できず、SSMSから実行すると正常に完了します

毎日1回実行するようにスケジュールされた2つのT-SQLスクリプトがあります。どちらも、異なるテーブルの古いデータをクリーンアップします。両方のスクリプトは、同じデータベースで同じユーザーとして実行されます。

スクリプトAは、SQL Server Management Studioとジョブとして起動された場合の両方で正常に実行されますが、スクリプトBは、SQL Serverでスクリプトを実行するように設定されているのと同じユーザーとしてログインした場合でも、SQL Server Management Studioでのみ正常に実行されます。エージェント。

スクリプトBは次のエラーで失敗します。

ユーザー[username]として実行されます。
次のSETオプションの設定が正しくないため、DELETEが失敗しました: 'QUOTED_IDENTIFIER'。

インデックス付きビューや計算列のインデックス、フィルター処理されたインデックス、クエリ通知、XMLデータ型メソッド、空間インデックス操作で使用するために、SETオプションが正しいことを確認してください。

[SQLSTATE 42000](エラー1934)。ステップは失敗しました。

クリーンアップしようとしているテーブルの1つにフィルター処理されたインデックスがありますが、なぜSSMSで機能するのですか?

4
Petter Brodin

SSMSのQUOTED_IDENTIFIERのデフォルトはONですが、SQLCMD、OSQL、BCP、特にSQL Serverエージェントの場合はOFFです。

参考までに、これらはアプリケーションごとに異なるデフォルトのオプションです

 + ------------------------- + ------------ + ----- -+ ------------------- + ------------ + 
 | | ADO .Net、| SSMS | SQLCMD、OSQL、BCP | ISQL | 
 | | ODBC | | SQL Serverエージェント| DB-Library | 
 | | OLE DB | | | | 
 + --------------------- ---- + ------------ + ------ + ------------------- + ----- ------- + 
 | ANSI_NULL_DFLT_ON | ON | ON | ON | OFF | 
 | ANSI_NULLS | ON | ON | ON | OFF | 
 | ANSI_PADDING | ON | ON | ON | OFF | 
 | ANSI_WARNINGS | ON | ON | ON | OFF | 
 | CONCAT_NULL_YIELDS_NULL | ON | ON | ON | OFF | 
 | QUOTED_IDENTIFIER | ON | ON |オフ|オフ| 
 | ARITHABORT |オフ|オン|オフ|オフ| 
 + ------------------------ -+ ------- ----- + ------ + ------------------- + ------------ +

上記の表は Erland Sommarskog からコピーされます

したがって、ジョブステップの最初の行としてSET QUOTED_IDENTIFIER ONを追加する必要があります。