毎日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で機能するのですか?
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
を追加する必要があります。