CHECKSUM (Transact-SQL)
傳回針對一份資料表的某個資料列或一份運算式清單,來計算的總和檢查碼值。CHECKSUM 用來建立雜湊索引。
語法
CHECKSUM ( * | expression [ ,...n ] )
引數
*
指定針對資料表的所有資料行來計算。如果有任何資料行是不可比較的資料類型,CHECKSUM 會傳回錯誤。不可比較的資料類型有 text、ntext、image、XML 和 cursor,以及基底類型為上述任一類型的 sql_variant。expression
這是在不可比較的資料類型之外,任何資料類型的運算式。
傳回類型
int
備註
CHECKSUM 會針對它的引數清單,來計算稱為總和檢查碼的雜湊值。雜湊值用來建立雜湊索引。如果 CHECKSUM 的引數是資料行,且在計算的 CHECKSUM 值上建立索引,結果就是雜湊索引。這可用來進行資料行的相等搜尋。
CHECKSUM 會滿足雜湊函數的屬性:如果兩份清單的對應元素有相同的類型,且利用等於 (=) 運算子來比較時相等,套用在任何兩份運算式清單上的 CHECKSUM 會傳回相同的值。對這項定義而言,指定類型的 Null 值會被視為比較結果相等。如果變更了運算式清單中的其中一個值,清單的總和檢查碼通常也會改變。不過,總和檢查碼也有可能不會變更。因此,我們不建議使用 CHECKSUM 來偵測是否已變更值,除非應用程式可以容忍偶爾遺失變更。請考慮改用 HashBytes。當指定 MD5 雜湊演算法時,HashBytes 為兩個不同的輸入傳回相同結果的可能性比 CHECKSUM 要低很多。
運算式的順序會影響 CHECKSUM 的結果值。搭配 CHECKSUM(*) 使用的資料行順序,是資料表或檢視定義所指定之資料行的順序。其中包括計算資料行。
範例
下列範例會示範如何利用 CHECKSUM 來建立雜湊索引。雜湊索引的建立方式,是將計算總和檢查碼資料行加入要建立索引的資料表,然後再建立總和檢查碼資料行的索引。
-- Create a checksum index.
SET ARITHABORT ON;
USE AdventureWorks;
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 值的任何變更都會傳播到總和檢查碼資料行。另外,您也可以在建立索引的資料行上,直接建立索引。不過,如果索引鍵值很長,可能不會執行正規索引及總和檢查碼索引。