CHECKSUM (Transact-SQL)
Gibt den Prüfsummenwert zurück, der für eine Zeile einer Tabelle oder eine Liste von Ausdrücken berechnet wurde. CHECKSUM wurde zum Verwenden beim Erstellen von Hashindizes konzipiert.
Syntax
CHECKSUM ( * | expression [ ,...n ] )
Argumente
*
Gibt an, dass die Berechnung für alle Spalten der Tabelle erfolgt. CHECKSUM gibt einen Fehler zurück, wenn eine Spalte einen nicht vergleichbaren Datentyp hat. Nicht vergleichbare Datentypen sind text, ntext, image, XML und cursor sowie sql_variant mit einem der vorstehenden Typen als Basistyp.expression
Ein Ausdruck eines beliebigen Typs mit Ausnahme eines nicht vergleichbaren Datentyps.
Rückgabetypen
int
Hinweise
CHECKSUM berechnet aus der Liste der Argumente einen Hashwert, der Prüfsumme genannt wird. Der Hashwert wurde zum Verwenden beim Erstellen von Hashindizes konzipiert. Wenn die Argumente für CHECKSUM Spalten sind und ein Index für den berechneten CHECKSUM-Wert erstellt wird, ist das Ergebnis ein Hashindex. Dieser kann für Gleichheitssuchen in den Spalten verwendet werden.
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 Typ sind und bezüglich des Vergleichs mit dem Gleichheitsoperator (=) gleich sind. Bei dieser Definition wird für NULL-Werte eines angegebenen Typs angenommen, dass sie bei einem Vergleich "gleich" sind. Wenn sich einer der Werte in der Liste mit Ausdrücken ändert, ändert sich gewöhnlich auch die Prüfsumme der Liste. Es besteht jedoch eine geringe Möglichkeit, dass sich die Prüfsumme nicht ändert. Aus diesem Grund wird nicht empfohlen, CHECKSUM für die Überprüfung auf geänderte Werte zu verwenden, außer es spielt für die Anwendung keine große Rolle, wenn gelegentlich eine Änderung nicht erkannt wird. Möglicherweise sollten Sie stattdessen HashBytes verwenden. Wenn ein MD5-Hashalgorithmus angegeben wird, ist die Wahrscheinlichkeit, dass HashBytes für zwei verschiedene Eingaben dasselbe Ergebnis zurückgibt, wesentlich geringer als bei CHECKSUM.
Die Reihenfolge von Ausdrücken wirkt sich auf den Ergebniswert für CHECKSUM aus. Bei CHECKSUM(*) wird die Spaltenreihenfolge verwendet, die in der Tabellen- oder Sichtdefinition angegeben ist. Dies schließt die berechneten Spalten ein.
Der CHECKSUM-Wert ist von der Sortierung abhängig. Für einen Wert wird ein anderer CHECKSUM-Wert zurückgegeben, wenn er mit einer anderen Sortierung gespeichert ist.
Beispiele
In den folgenden Beispielen wird die Verwendung von CHECKSUM zum Erstellen von Hashindizes gezeigt. Ein Hashindex wird erstellt, indem eine Spalte mit berechneten Prüfsummen zur indizierten Tabelle hinzugefügt wird und dann ein Index aus der Prüfsummenspalte erstellt wird.
-- Create a checksum index.
SET ARITHABORT ON;
USE AdventureWorks2008R2;
GO
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO
Der Prüfsummenindex kann als Hashindex verwendet werden, insbesondere zur Erhöhung der Indizierungsgeschwindigkeit, wenn die Spalte, für die der Index erstellt werden soll, lange Zeichenfolgen enthält. 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. Ein Index kann jedoch auch direkt für die indizierte Spalte erstellt werden. Wenn die Schlüsselwerte jedoch lang sind, ist ein normaler Index wahrscheinlich nicht so leistungsfähig wie ein Prüfsummenindex.
Siehe auch