次の方法で共有


BINARY_CHECKSUM (Transact-SQL)

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

テーブルの 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 ハッシュ アルゴリズムを指定した場合は、HASHBYTES から 2 つの異なる入力に対して同じ結果が返される可能性が BINARY_CHECKSUM よりもはるかに低くなります。

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

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

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

  • char
  • nchar
  • nvarchar
  • varchar

or

  • sql_variant (sql_variant の基本データ型が文字列データ型の場合)。

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

BINARY_CHECKSUM では、任意の長さの varbinary(max) 型の文字と、最大 255 文字の 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  

関連項目

集計関数 (Transact-SQL)
CHECKSUM_AGG (Transact-SQL)
CHECKSUM (Transact-SQL)
HASHBYTES (Transact-SQL)