CHECKSUM (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Microsoft Fabric 中的 SQL 分析端點 Microsoft Fabric 中的倉儲
CHECKSUM
函式會傳回針對資料表資料列或運算式清單所計算的總和檢查碼值。 使用 CHECKSUM
建置雜湊索引。
Syntax
CHECKSUM ( * | expression [ ,...n ] )
注意
Azure Synapse Analytics 的無伺服器 SQL 集區不支援此語法。
引數
*
此引數指定總和檢查碼計算涵蓋所有資料表資料行。 如果任何資料行具有無法比較的資料類型,則 CHECKSUM
會傳回錯誤。 無法比較的資料類型包含:
- cursor
- image
- ntext
- text
- XML
另一個無法比較的資料類型是將上述任一個資料類型作為其基底類型的 sql_variant。
expression
任何類型的運算式 (無法比較的資料類型除外)。
傳回類型
int
備註
CHECKSUM
會針對它的引數清單來計算稱為總和檢查碼的雜湊值。 使用此雜湊值來建置雜湊索引。 如果 CHECKSUM
函數具有資料行引數,而且會針對計算得來的 CHECKSUM
值建置索引,則將會產生雜湊索引。 這可用來進行資料行的相等搜尋。
CHECKSUM
函式滿足雜湊函式屬性:如果兩份清單的對應項目具有相同的資料類型,而且這些對應的項目在使用等於 (=) 運算子比較時相等,則套用至任兩份運算式清單的 CHECKSUM
會傳回相同的值。 針對 CHECKSUM
函式目的,定義所指定類型的 Null 值以比較為相等。 如果運算式清單中至少有一個值變更,則清單總和檢查碼可能會變更。 不過,不保證一定會如此。
因此,若要偵測值是否已變更,建議只有在您的應用程式可以容忍偶而遺失的變更時才使用 CHECKSUM
。 否則,請考慮改用 HASHBYTES
。 使用指定的 MD5 雜湊演算法,HASHBYTES
將為兩個不同的輸入傳回相同結果的可能性比 CHECKSUM
要低很多。
CHECKSUM
會忽略 Nchar 和 Nvarchar 虛線字元 (N'-'
或 nchar(45)
)。 因此,如果任何兩個字串的唯一差異是虛線,則保證會有雜湊衝突。 換句話說,Select checksum(nchar(45));
和 Select checksum(N'-');
都會傳回 0
的值,因此不會影響字串中任何其他字元的雜湊,或總和檢查碼清單中的任何其他資料。
實際問題:
- 總和檢查碼會忽略數值字串中的負標誌
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
- 總和檢查碼比較無法偵測到在預存程式定義中註解的程式碼
CREATE PROCEDURE Checksum_Test AS
BEGIN
RAISERROR('Error Raised',18,1);
RETURN 1;
END
GO
-- get checksum for original proc definition.
SELECT
checksum(definition),
definition
FROM sys.sql_modules
WHERE object_id = object_id('Checksum_Test');
GO
-- comment out a line of code in the proc.
ALTER PROCEDURE Checksum_Test AS
BEGIN
--RAISERROR('Error Raised',18,1);
RETURN 1;
END
GO
-- get checksum for altered proc definition. Note the definition text now includes the -- comment dashes.
SELECT
checksum(definition),
definition
FROM sys.sql_modules
WHERE object_id = object_id('Checksum_Test');
DROP PROCEDURE Checksum_Test
CHECKSUM
會修剪 Nchar 和 Nvarchar 字串的尾端空格。 影響與忽略虛線的問題相同。
運算式順序會影響計算的 CHECKSUM
值。 用於 CHECKSUM(*)
的資料行順序,就是資料表或檢視定義中所指定的資料行順序。 計算資料行也包括在內。
CHECKSUM
值取決於定序。 以不同定序儲存的相同值,將會傳回不同的 CHECKSUM
值。
CHECKSUM ()
不保證結果是唯一的。
範例
這些範例示範如何使用 CHECKSUM
建置雜湊索引。
若要建置雜湊索引,第一個範例會將計算的總和檢查碼資料行新增至我們想要編製索引的資料表。 它接著會建置總和檢查碼資料行的索引。
-- Create a checksum index.
SET ARITHABORT ON;
USE AdventureWorks2022;
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
值的任何變更都會傳播到總和檢查碼資料行。 或者,我們可以直接建置想要編製索引之資料行的索引。 不過,對於長索引鍵值,可能不會執行一般索引和總和檢查碼索引。
另請參閱
CHECKSUM_AGG (Transact-SQL)
HASHBYTES (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)