ストアドプロシージャのnull可能なフィールドの比較

私はストアドプロシージャに問題があります。新しいレコードと既存のレコードを比較して、変更をチェックしています。これは次のように行われます:

SELECT 1 FROM Table
WHERE Id= @Id
AND Field1 = @Field1
AND Field2 = @Field2
AND Field3 = @Field3
AND Field4 = @Field4
AND Field5 = @Field5
AND LEDTS IS NULL

フィールドがNULLの場合、これは失敗するようです。私が知っている= NULLはあなたがそれを期待するかもしれない方法では動作しませんが、私はそれもこのようなことに失敗するのか分かりませんでした。フィールドの比較を次のようなものに変更すると

(Field1 IS NULL AND Field2 IS NULL) OR Field1 = @Field2

それは動作します。これを行うより良い方法はありますか?

1
コード、XML、またはデータサンプルを投稿する場合は、テキストエディタでこれらの行を表示し、エディタツールバーの[コードサンプル]ボタン( {} )うまくフォーマットと構文が強調表示されます!
追加された 著者 marc_s,
私はこの迷惑にも興味があります。
追加された 著者 Valamas,

3 答え

次のようなチェックを使うことができます:

ISNULL(Field1, '') = ISNULL(@Field1, '')

これをやっていて、邪悪なことがあります。

NULL='' or ''=NULL

私はそれがあなたのシナリオで受け入れられるかどうかを知りません。

2
追加された
パフォーマンスは問題ではないが問題はないが、これはうまくいかない。
追加された 著者 HLGEM,

SET ANSI_NULLS can control this behavior... Setting SET ANSI_NULLS OFF will make NULL = NULL evaluate to true.

しかし、実際に SET ANSI_NULLS OFF を設定することをお勧めします。代わりに、 "nullable"であるデータベースのフィールドを制限しようとします。

2
追加された
ありがとう。残念なことに、空のフィールドの数を制限することはできませんので、ANSI_NULLSオプションを使用します。しかし、私は賢明にそれを使用することを確認します;)
追加された 著者 Jasper,
@ JoeStefanelli大丈夫ですが、代わりに適切なチェックをすることをお勧めしますか?
追加された 著者 Jasper,
面倒ですが、投稿した比較はNULL値をチェックする良い方法です。
追加された 著者 Michael Fredrickson,
私は、特に SET ANSI_NULLS OFF 廃止予定の機能
追加された 著者 Joe Stefanelli,

この動作は ANSI_NULLS の設定によって制御されます。これはデフォルトで ON に設定されており、さまざまなことが正しく機能するように(インデックス付きビューや分散クエリなど)設定する必要がありますが、必要ない場合はスイッチをオフにすることができます。

詳細については、オンラインブックを参照してください。

1
追加された
私は別の答えにコメントしたので、 SET ANSI_NULLS OFF 廃止予定の機能を削除します。
追加された 著者 Joe Stefanelli,