CHECKSUM (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPoint de terminaison analytique SQL dans Microsoft FabricEntrepôt dans Microsoft Fabric

La fonction CHECKSUM retourne la valeur de somme de contrôle calculée à partir de la ligne d’une table ou à partir d’une liste d’expressions. Utilisez CHECKSUM pour générer des index de hachage.

Conventions de la syntaxe Transact-SQL

Syntaxe

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

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez Versions antérieures de la documentation.

Remarque

Cette syntaxe n’est pas prise en charge par le pool SQL serverless dans Azure Synapse Analytics.

Arguments

*
Cet argument spécifie que le calcul de la somme de contrôle couvre toutes les colonnes de la table. CHECKSUM retourne une erreur si une colonne est d’un type de données incomparable. Les types de données incomparables sont notamment :

  • cursor
  • image
  • ntext
  • text
  • XML

Un autre type de données incomparable est sql_variant avec l’un des types précédents comme type de base.

expression
Expression de type quelconque, à l’exception d’un type de données incomparable.

Types de retour

int

Notes

CHECKSUM calcule une valeur de hachage, appelée somme de contrôle, sur sa liste d’arguments. Utilisez cette valeur de hachage pour générer des index de hachage. Un index de hachage est obtenu si la fonction CHECKSUM a des arguments de colonne et qu’un index est créé sur la valeur CHECKSUM calculée. qui peut être utilisé dans des recherches d'égalité sur les colonnes.

La fonction CHECKSUM a les propriétés d’une fonction de hachage : quand CHECKSUM est appliqué à deux listes d’expressions, la même valeur est retournée si les éléments correspondants dans les deux listes sont du même type de données et ont une valeur égale lorsqu’ils sont comparés à l’aide de l’opérateur d’égalité (=). Les valeurs NULL d’un type spécifié sont définies comme ayant une valeur de comparaison égale dans le cadre de la fonction CHECKSUM. Si au moins l’une des valeurs de la liste d’expressions change, la somme de contrôle de liste est susceptible de changer aussi. Toutefois, cela n’est pas garanti. Par conséquent, nous conseillons d’utiliser CHECKSUM pour vérifier si des valeurs ont changé uniquement si votre application peut accepter une modification parfois manquée. Sinon, envisagez d’utiliser HASHBYTES à la place. Avec un algorithme de hachage MD5 spécifié, la probabilité que HASHBYTES retourne le même résultat pour deux entrées différentes est beaucoup plus faible par rapport à CHECKSUM.

CHECKSUM ignore les caractères tiret nchar et nvarchar (N'-' ou nchar(45)). Ainsi, une collision de hachage est garantie pour toute paire de chaînes qui ne se différencient que par des tirets. En d’autres termes, Select checksum(nchar(45)); et Select checksum(N'-'); retournent tous les deux la valeur 0, ils n’ont donc aucun effet sur le hachage de caractères supplémentaires dans la chaîne ou sur des données supplémentaires dans la liste de somme de contrôle. Problèmes pratiques :

  1. La somme de contrôle ignore la signature négative dans une chaîne numérique
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Une comparaison de somme de contrôle ne peut pas détecter que le code a été mis en commentaire dans une définition de procédure stockée
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 supprime les espaces de fin des chaînes nchar et nvarchar. L’effet est le même que le problème des tirets ignorés.

L’ordre des expressions affecte la valeur CHECKSUM calculée. L’ordre des colonnes utilisé pour CHECKSUM(*) est celui spécifié dans la définition de la table ou de la vue, y compris les colonnes calculées.

La valeur de CHECKSUM dépend du classement. La même valeur stockée avec un autre classement retourne une valeur CHECKSUM différente.

CHECKSUM () ne garantit pas des résultats uniques.

Exemples

Ces exemples illustrent l’utilisation de CHECKSUM pour générer des index de hachage.

Pour générer l’index de hachage, le premier exemple ajoute une colonne de somme de contrôle calculée à la table à indexer. Il génère ensuite un index sur la colonne de somme de contrôle.

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

Cet exemple illustre l’utilisation d’un index de somme de contrôle comme index de hachage. Cela peut permettre d’améliorer la vitesse d’indexation quand la colonne à indexer est une colonne contenant des chaînes de caractères longues. L'index de la somme de contrôle peut être utilisé dans les recherches d'égalité.

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

La création d’index sur la colonne calculée matérialise la colonne de somme de contrôle, et toutes les modifications apportées à la valeur ProductName sont propagées à cette colonne. Nous pourrions également créer un index directement sur la colonne à indexer. Toutefois, pour les valeurs de clé longues, un index normal n’est probablement pas aussi performant qu’un index de somme de contrôle.

Voir aussi

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