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:
- Die Prüfsumme ignoriert negative Signaturen in numerischen Zeichenfolgen.
SELECT CHECKSUM(N'1'), CHECKSUM(N'-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)