CHECKSUM (Transact-SQL)

テーブルの 1 つの行、または一連の式に対して計算されたチェックサム値を返します。CHECKSUM は、ハッシュ インデックスの作成に使用します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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

引数

  • *
    テーブルのすべての列を計算の対象とします。列のいずれかが比較できないデータ型である場合、CHECKSUM ではエラーが返されます。比較できないデータ型には、text、ntext、image、XML、および cursor に加え、これらの型のいずれかを基本データ型とする sql_variant もあります。

  • expression
    比較できないデータ型を除く、任意のデータ型のを指定します。

戻り値の型

int

説明

CHECKSUM では、一連の引数に対してハッシュ値 (チェックサム) が計算されます。このハッシュ値はハッシュ インデックスの作成に使用されます。CHECKSUM の引数に列を指定し、計算された CHECKSUM 値を基にインデックスを作成すると、結果はハッシュ インデックスになります。このハッシュ インデックスは、列で等値検索を行うときに使用できます。

CHECKSUM はハッシュ関数のプロパティとなります。CHECKSUM を任意の 2 つの式に適用した場合、その 2 つに対応する要素のデータ型が同じで、等号 (=) 演算子により比較した場合に等しければ、同じ値が返されます。この定義では、指定した型が NULL 値である場合、これらの値は等しいものとして比較されます。いずれかの式の値を変更した場合は通常、そのリストのチェックサムも変わりますが、チェックサムが変わらない場合もわずかですがあります。したがって、アプリケーションで値の変更をすべて検出する必要がある場合は、値の変更の検出に CHECKSUM を使用しないことをお勧めします。代わりに HashBytes を使用することを検討してください。MD5 ハッシュ アルゴリズムを指定した場合は、HashBytes から 2 つの異なる入力に対して同じ結果が返される可能性が CHECKSUM よりもはるかに低くなります。

式の順序は、CHECKSUM の結果の値に影響します。CHECKSUM(*) で使用される列の順序は、テーブルまたはビュー定義で指定される列の順序です。これには計算列も含まれます。

CHECKSUM 値は照合順序によって異なります。同じ値であっても異なる照合順序で格納されている場合は、別の CHECKSUM 値が返されます。

次の例では、CHECKSUM を使ってハッシュ インデックスを作成します。ハッシュ インデックスを作成するときは、計算されたチェックサム列をインデックスの作成先のテーブルに追加し、そのチェックサム列に対してインデックスを作成します。

-- Create a checksum index.
SET ARITHABORT ON;
USE AdventureWorks2008R2; 
GO
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO

このチェックサム インデックスを、ハッシュ インデックスとして使用できます。特にインデックスを作成する列の文字列が長い場合は、インデックス作成速度を向上できます。チェックサム インデックスは、等値検索に使用できます。

/*Use the index in a SELECT query. Add a second search 
condition to catch stray cases where checksums match, 
but the values are not the same.*/
SELECT * 
FROM Production.Product
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
AND Name = N'Bearing Ball';
GO

計算列にインデックスを作成するとチェックサム列が具体化され、ProductName 値を変更すると、それがどのような変更であってもチェックサム列に反映されます。インデックスを作成する列に直接インデックスを作成することもできます。ただし、キー値が長いと標準インデックスおよびチェックサム インデックスは機能しない可能性があります。