アプリケーションからの SQL クエリは、通常SET ARITHBAORT OFF
、SSMS (デフォルト) が使用する where を使用することを十分に認識していますSET ARITHBAORT ON
。SET ARITHBAORT OFF
また、これは従来の互換性のためにのみ存在すると考えており、実際にはクエリは で実行する必要がありますSET ARITHBAORT ON
。
C# コンソール アプリ バッチ ファイルの一部として実行されるクエリがあります。コンテキストは (デフォルトで) と で準備されSET ARITHBAORT OFF
ます SET ANSI_WARNINGS ON
。最初の 92 回の呼び出しは正常に実行され、93 回目は常にロックされます (各呼び出しは異なるパラメーターを使用します)。SET ARITHBAORT OFF
93回目の呼び出しからのパラメーターを使用してストアドプロシージャを呼び出す前に使用すると、SSMSでこれを再現できました。
それでは、私の質問に進みます (これまでの背景情報で申し訳ありません) 。Erland Sommarskog の記事には次のように記載されています。
次に、ARITHABORT に関して言えば、SQL 2005 以降のバージョンでは、ANSI_WARNINGS が ON である限り、この設定による影響はまったくないことを知っておく必要があります。したがって、問題のためにそれをオンにする理由はありません。
ただし、SQL Server 2014 を使用していますが、次のことがわかりました。
SET ARITHBAORT ON
SET ANSI_WARNINGS ON
EXEC mySP -- Runs efficiently
正常に動作しますが、
SET ARITHBAORT OFF
SET ANSI_WARNINGS ON
EXEC mySP -- Runs indefinitely
無期限に実行されます。したがってSET ANSI_WARNINGS ON
、ARITHBAORT
オプションを無関係にする場合、クエリがロックされるのはなぜですか? ありがとう。