Freigeben über


CHECKSUM (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric

Die CHECKSUM-Funktion gibt den Prüfsummenwert zurück, der für eine Zeile einer Tabelle oder eine Liste mit Ausdrücken berechnet wurde. Verwenden Sie CHECKSUM, um Hashindizes zu erstellen.

Transact-SQL-Syntaxkonventionen

Syntax

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

Hinweis

Diese Syntax wird vom serverlosen SQL-Pool in Azure Synapse Analytics nicht unterstützt.

Argumente

*
Dieses Argument gibt an, dass die Berechnung der Prüfsumme für alle Tabellenspalten gilt. CHECKSUM gibt einen Fehler zurück, wenn eine Spalte einen nicht vergleichbaren Datentyp aufweist. Die folgenden Datentypen sind z.B. nicht vergleichbar:

  • Cursor
  • image
  • ntext
  • text
  • XML

Ein weiterer nicht vergleichbarer Datentypen ist sql_variant mit einem der vorstehenden Typen als Basistyp.

expression
Ein Ausdruck eines beliebigen Typs mit Ausnahme eines nicht vergleichbaren Datentyps.

Rückgabetypen

int

Bemerkungen

CHECKSUM berechnet aus der Liste der Argumente einen Hashwert, der Prüfsumme genannt wird. Verwenden Sie diesen Hashwert zum Erstellen von Hashindizes. Wenn die CHECKSUM-Funktion Spaltenargumente aufweist, ist das Ergebnis ein Hashindex, und ein Index für den berechneten CHECKSUM-Wert wird erstellt. Dieser kann für Gleichheitssuchen in den Spalten verwendet werden.

Die Funktion CHECKSUM erfüllt die Eigenschaften einer Hashfunktion: Wenn CHECKSUM auf zwei beliebige Listen mit Ausdrücken angewendet wird, wird immer derselbe Wert zurückgegeben, falls die entsprechenden Elemente der beiden Listen vom gleichen Datentyp sind und bezüglich des Vergleichs mit dem Gleichheitsoperator (=) gleich sind. NULL-Werte eines angegebenen Typs werden definiert, um zu prüfen, ob sie gleich sind (zu Zwecken der CHECKSUM-Funktion). Wenn sich einer der Werte in der Liste mit Ausdrücken ändert, ändert sich gewöhnlich auch die Prüfsumme der Liste. Dies ist jedoch nicht immer der Fall. Daher wird empfohlen, CHECKSUM nur zur Ermittlung von Änderungen der Daten zu verwenden, wenn Ihre Anwendung auch bei gelegentlich nicht ausgeführten Änderungen weiter ausgeführt werden kann. Sie sollten andernfalls in Betracht ziehen, stattdessen HASHBYTES zu verwenden. Wenn ein MD5-Hashalgorithmus angegeben ist, ist die Wahrscheinlichkeit, dass HASHBYTES für zwei verschiedene Eingaben dasselbe Ergebnis zurückgibt, wesentlich geringer als bei der Verwendung von CHECKSUM.

CHECKSUM ignoriert nchar und das nvarchar-Bindestrichzeichen (N'-' oder nchar(45)). Daher ist eine Hashkollision für alle zwei Zeichenfolgen garantiert, die sich nur durch Bindestriche unterscheiden. Anders ausgedrückt, sowohl Select checksum(nchar(45)); als auch Select checksum(N'-'); geben den Wert 0 zurück, weshalb sie keine Auswirkungen auf den Hashwert jeglicher zusätzlicher Zeichen in der Zeichenfolge oder auf andere zusätzliche Daten in der Prüfsummenliste haben. Probleme in der Praxis:

  1. Die Prüfsumme ignoriert negative Signaturen in numerischen Zeichenfolgen.
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Ein Prüfsummenvergleich kann nicht ermitteln, dass Code in der gespeicherten Prozessordefinition auskommentiert wurde.
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 kürzt nachstehende Leerzeichen aus nchar- und nvarchar-Zeichenfolgen. Die Wirkung ist identisch mit dem Problem mit ignorierten Bindestrichen.

Die Ausdrucksreihenfolge wirkt sich auf den berechneten CHECKSUM-Wert aus. Die Spaltenreihenfolge, die bei CHECKSUM(*) verwendet wird, ist die Spaltenreihenfolge, die in der Tabellen- oder Sichtdefinition angegeben ist. Dies schließt die berechneten Spalten ein.

Der CHECKSUM-Wert ist von der Sortierung abhängig. Der gleiche Wert gibt einen anderen CHECKSUM-Wert zurück, wenn er mit einer anderen Sortierung gespeichert ist.

CHECKSUM () garantiert keine eindeutigen Ergebnisse.

Beispiele

In diesen Beispielen wird veranschaulicht, wie Sie mit CHECKSUM Hashindizes erstellen können.

Im ersten Beispiel wird eine Spalte für die berechnete Prüfsumme der zu indizierenden Tabelle hinzugefügt, um einen Hashindex zu erstellen. Dann wird ein Index in der Prüfsummenspalte erstellt.

-- 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  

In diesem Beispiel wird veranschaulicht, wie der Prüfsummenindex als Hashindex verwendet werden kann. So verläuft die Indizierung schneller, wenn die zu indizierende Spalte eine Spalte mit langen Zeichen ist. Der Prüfsummenindex kann für die Gleichheitssuche verwendet werden.

/*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  

Durch Erstellen des Indexes für die berechnete Spalte wird die Prüfsummenspalte materialisiert, und die Änderungen des ProductName-Werts werden an die Prüfsummenspalte weitergegeben. Alternativ können Sie einen Index direkt in der zu indizierenden Spalte erstellen. Bei langen Schlüsselwerten ist die Leistung eines normales Indexes wahrscheinlich geringer als die eines Prüfsummenindexes.

Weitere Informationen

CHECKSUM_AGG (Transact-SQL)
HASHBYTES (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)