次の方法で共有


BINARY_CHECKSUM(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

テーブルの 1 つの行、または一連の式に対して計算された、バイナリのチェックサム値を返します。

Transact-SQL 構文表記規則

構文

BINARY_CHECKSUM ( * | expression [ , ...n ] )

Note

この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。

引数

*

計算がすべてのテーブルの列に対して行われることを指定します。 BINARY_CHECKSUM 計算において比較できないデータ型の列は無視します。 比較できないデータ型には以下が含まれます:

  • cursor
  • image
  • ntext
  • text
  • xml
  • 非比較共通言語ランタイム(CLR)ユーザー定義型

式 (expression)

任意のデータ型のBINARY_CHECKSUM 計算において、比較できないデータ型の表現は無視します。

戻り値の型

int

解説

テーブルの任意の行で計算される BINARY_CHECKSUM(*) では、行が後で変更されていない限り、同じ値が返されます。 BINARY_CHECKSUM はハッシュ関数の性質を満たします。任意の2つの式のリストに適用すると、対応する2つのリストの要素が同じ型を持ち、等価(=)演算子を用いて等しい場合、同じ値を返します。

この定義では、指定した型が NULL 値であるとすると、等しい値として比較されます。 式リストのいずれかの値を変更した場合は、その式のチェックサムも変わります。 しかし、この変更は必ずしも行われるわけではないため、値が変わったかどうかを検出するには、アプリケーションが時折の変更漏れを許容できる場合にのみ BINARY_CHECKSUM を使うべきです。 それ以外の場合は、代わりに HASHBYTES の使用を検討してください。 指定されたMD5ハッシュアルゴリズムでは、異なる2つの入力に対して同じ結果を返す確率HASHBYTESBINARY_CHECKSUMよりもはるかに低くなります。

BINARY_CHECKSUM は式のリスト全体を処理でき、指定されたリストに対して同じ値を返します。 BINARY_CHECKSUM を 2 つの式のリストに適用した場合、2 つのリストの対応する要素が同じ型と同じバイト表現であれば、同じ値が返されます。 この定義では、指定した型の値が NULL であった場合、これらの値は同じバイト表現として扱われます。

BINARY_CHECKSUMCHECKSUM は類似する関数です。 式のリストにあるチェックサム値を計算するために使用でき、式の順序は結果となる値に影響します。 BINARY_CHECKSUM(*) で使用される列の順序は、テーブルまたはビュー定義に指定された列の順序です。 この順序には、計算列が含まれます。

ロケールによっては、異なる表現の文字列が等しいとして比較される場合があります。このような場合、BINARY_CHECKSUMCHECKSUM では文字列データ型に対して異なる値が返されます。 文字列データ型は以下の通りです:

  • char
  • nchar
  • nvarchar
  • varchar
  • sql_variant ( sql_variant の基本型が文字列データ型の場合)

例えば、文字列 McCavityMccavity は異なる BINARY_CHECKSUM 値を持っています。 これに対し、大文字小文字が区別されないサーバーの場合、CHECKSUM ではこれらの文字列に同じチェックサム値が返されます。 CHECKSUM 値と BINARY_CHECKSUM 値の比較は避ける必要があります。

BINARY_CHECKSUM 任意の長さの varbinary(max)と最大255文字の nvarchar(n) / nvarchar(max)をサポートしています。

この例では、BINARY_CHECKSUM を使用して、テーブル行の変更を検出します。

USE AdventureWorks2022;
GO

CREATE TABLE myTable (column1 INT, column2 VARCHAR (256));
GO

INSERT INTO myTable VALUES (1, 'test');
GO

SELECT BINARY_CHECKSUM(*) FROM myTable;
GO

UPDATE myTable SET column2 = 'TEST';
GO

SELECT BINARY_CHECKSUM(*) FROM myTable;
GO