返回在表的行上或在表達(dá)式列表上計算的校驗值。CHECKSUM 用于生成哈希索引。
CHECKSUM ( * | expression [ ,...n ] )
*
指定在表的所有列上進(jìn)行計算。如果有任一列是非可比數(shù)據(jù)類型,則 CHECKSUM 返回錯誤。不可比數(shù)據(jù)類型是 text、ntext、image、cursor 以及基本類型為前 4 個數(shù)據(jù)類型之一的 sql_variant。
expression
是除非可比數(shù)據(jù)類型之外的任何類型的表達(dá)式。
int
CHECKSUM 在其參數(shù)列表上計算一個稱為校驗值的哈希值。此哈希值用于生成哈希索引。如果 CHECKSUM 的參數(shù)是列,且在計算的 CHECKSUM 值上生成索引,則其結(jié)果是可用于在列上等價搜索的哈希索引。
CHECKSUM 滿足哈希函數(shù)的下列屬性:在使用等于 (=) 運算符比較時,如果兩個列表的相應(yīng)元素具有相同類型且"相等",則在任何兩個表達(dá)式列表上應(yīng)用的 CHECKSUM 將返回同一值。這種定義的目的在于:給定類型的 NULL 值被作為"相等"進(jìn)行比較。如果表達(dá)式列表中的某個值發(fā)生變化,那么列表的校驗值通常也會變化。但只在極少數(shù)情況下,校驗值會保持不變。
BINARY_CHECKSUM 和 CHECKSUM 具有相似的功能:它們可用于計算表達(dá)式列表上的校驗值,且表達(dá)式的順序?qū)⒂绊懡Y(jié)果值。在 CHECKSUM(*) 中使用的列順序是在表或視圖定義中指定的列順序,包括計算列。
CHECKSUM 和 BINARY_CHECKSUM 僅為字符串?dāng)?shù)據(jù)類型返回不同的值,這類字符串的區(qū)域設(shè)置可能導(dǎo)致具有不同表示法的字符串進(jìn)行等值比較。字符串?dāng)?shù)據(jù)類型是 char、varchar、nchar、nvarchar 或 sql_variant(如果其基本類型是字符串?dāng)?shù)據(jù)類型)。例如,字符串"McCavity"和"Mccavity"的 BINARY_CHECKSUM 值不同。反之,在不區(qū)分大小寫的服務(wù)器中,上述字符串的 CHECKSUM 返回相同的校驗值。CHECKSUM 值不應(yīng)與 BINARY_CHECKSUM 值進(jìn)行比較。
CHECKSUM 函數(shù)可以用于生成哈希索引。通過將計算校驗值列添加到索引的表中,然后在校驗值列上生成索引來生成哈希索引。
-- Create a checksum index.
SET ARITHABORT ON
USE Northwind
GO
ALTER TABLE Products
ADD cs_Pname AS checksum(ProductName)
CREATE INDEX Pname_index ON Products (cs_Pname)
校驗值索引可用作哈希索引,尤其是當(dāng)要索引的列為較長的字符列時可以提高索引速度。校驗值索引可用于等價搜索。
/*Use the index in a SELECT query. Add a second search
condition to catch stray cases where checksums match,
but the values are not identical.*/
SELECT *
FROM Products
WHERE checksum(N'Vegie-spread') = cs_Pname
AND ProductName = N'Vegie-spread'
在計算列上創(chuàng)建的索引將具體化為校驗值列,對 ProductName 值所做的任何更改將傳播到校驗值列。索引也可以直接建立在索引的列上。然而,如果鍵值較長,則很可能不執(zhí)行校驗值索引甚至常規(guī)索引。
相關(guān)文章