4

マージ ステートメントで NULL を比較するために数十億のレコードを処理する場合、どのステートメントが完璧または優れているか。SET ANSI_NULLS OFF で試しましたが、マージ ステートメントでは機能しませんでした。これが私の2つの方法です

ISNULL(SRCColumn,-11111) = ISNULL(DSTColumn, -11111)

または

SRCColumn = DSTColumn OR (SRCColumn  IS NULL AND DSTColumn  IS NULL)

何か良い対処法があれば教えてください。比較する列が約15あるため。

4

3 に答える 3

4

SRCColumn = DSTColumn OR (SRCColumn IS NULL AND DSTColumn IS NULL)

このバージョンを使用することをお勧めします。これは、SQL Server に実行してもらいたいことを最も正確に表現しているからです。

両方のステートメントは論理的に同等ですが (-11111 が列の有効な値でない限り)、このステートメントの方がはるかに認識しやすく、2 つのステートメントの実行時のパフォーマンスの違いはおそらくごくわずかです。

于 2013-03-18T02:01:02.110 に答える
2

パフォーマンスよりも簡潔さに関心がある場合は、CHECKSUM() もオプションです。NULL -> NULL に一致します。

MERGE A
USING B
ON A.Key = B.Key
WHEN MATCHED AND CHECKSUM(A.Col1, A.Col2, ... ) <> CHECKSUM(B.Col1, B.Col2, ... )
THEN UPDATE SET Col1 = B.Col1, Col1 = B.Col2, ...
于 2014-07-14T14:17:48.583 に答える