適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric の SQL データベース
テーブルの 1 つの行、または一連の式に対して計算された、バイナリのチェックサム値を返します。
構文
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_CHECKSUM と CHECKSUM は類似する関数です。 式のリストにあるチェックサム値を計算するために使用でき、式の順序は結果となる値に影響します。
BINARY_CHECKSUM(*) で使用される列の順序は、テーブルまたはビュー定義に指定された列の順序です。 この順序には、計算列が含まれます。
ロケールによっては、異なる表現の文字列が等しいとして比較される場合があります。このような場合、BINARY_CHECKSUM と CHECKSUM では文字列データ型に対して異なる値が返されます。 文字列データ型は以下の通りです:
- char
- nchar
- nvarchar
- varchar
- sql_variant ( sql_variant の基本型が文字列データ型の場合)
例えば、文字列 McCavity と Mccavity は異なる 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