27

注: QUOTED_IDENTIFIERの理解を確認しましたが、私の質問には答えません。

私は自分の Prod サーバーで作成したインデックスを DBA に実行してもらいました (彼らはそれを調べて承認しました)。

私が望んでいたように、それは私のクエリをスピードアップしました。ただし、次のようなエラーが発生し始めました。

次の SET オプションの設定が正しくないため、UPDATE が失敗しました: ANSI_NULL、QUOTED_IDENTIFIER、CONCAT_NULL_YIELDS_NUL

開発者として、私は通常、これらの設定を無視してきました。そして、それは決して問題ではありません。(9 年以上)。さて、今日は重要です。

私は行って、失敗しているsprocの1つを見ました.sprocの作成前にこれがあります:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

アプリケーション開発者の観点から、これらの set ステートメントが何をするのか教えてもらえますか? (インデックス作成ステートメントの前に上記のコードを追加するだけでは、問題は解決しませんでした。)

注:これは私のインデックスがどのように見えるかの例です:

CREATE NONCLUSTERED INDEX [ix_ClientFilerTo0]
ON [ClientTable] ([Client])
INCLUDE ([ClientCol1],[ClientCol2],[ClientCol3] ... Many more columns)
WHERE Client = 0


CREATE NONCLUSTERED INDEX [IX_Client_Status]
ON [OrderTable] ([Client],[Status])
INCLUDE ([OrderCol1],[OrderCol2],[OrderCol3],[OrderCol4])
WHERE [Status] <= 7
GO
4

4 に答える 4

81

OK、アプリケーション開発者の観点から、これらの設定が行うことは次のとおりです。

QUOTED_IDENTIFIER

".."この設定は、SQL コンパイラによる引用符の解釈方法を制御します。が ON の場合QUOTED_IDENTIFIER、引用符は大括弧 ( [...]) のように扱われ、テーブル名、列名などの SQL オブジェクト名を引用するために使用できます。OFF の場合 (推奨されません)、引用符はアポストロフィ ( '..') のように扱われ、使用できます。 SQL コマンドでテキスト文字列を引用します。

ANSI_NULLS

ISこの設定は、NULL以外の比較演算子を使用しようとしたときの動作を制御します。ON の場合、これらの比較は、NULL との比較は常に失敗し (値ではなく、フラグであるため)、 を返すという標準に従いますFALSE。この設定が OFF の場合 (実際には推奨されません)、値のようにうまく処理し=<>、 などを使用して、適切に TRUE を返すことができます。

これを処理する適切な方法は、代わりにIS( ColumnValue IS NULL ..) を使用することです。

CONCAT_NULL_YIELDS_NULL

この設定は、文字列式で使用される場合に NULL を「伝達」するかどうかを制御します。この設定が ON の場合、標準に従い、次のような式は'some string' + NULL ..常に NULL を返します。したがって、一連の文字列連結では、1 つの NULL によって式全体が NULL を返す可能性があります。これを OFF にすると (これも推奨されません)、NULL は代わりに空の文字列のように扱われるため、'some string' + NULL単に と評価され'some string'ます。

これを処理する適切な方法は、COALESCE (または ISNULL) 関数を使用することです'some string' + COALESCE(NULL, '') ..

于 2013-10-03T20:50:51.957 に答える