CHECKSUM (Transact-SQL)
S’applique à : SQL Server base de données Azure SQL Azure SQL Managed Instance Azure Synapse Analytics Point de terminaison analytique SQL dans Microsoft Fabric Entrepô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 ] )
Notes
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 :
- La somme de contrôle ignore la signature négative dans une chaîne numérique
SELECT CHECKSUM(N'1'), CHECKSUM(N'-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)