CHECKSUM (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL-analysendpoint i Microsoft FabricLager i Microsoft FabricSQL-databas i Microsoft Fabric

Funktionen CHECKSUM returnerar kontrollsumman som beräknats över en tabellrad eller över en uttryckslista. Använd CHECKSUM för att bygga hashindex.

Transact-SQL syntaxkonventioner

Syntax

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

Anmärkning

Den här syntaxen stöds inte av en serverlös SQL-pool i Azure Synapse Analytics.

Arguments

*
Detta argument specificerar att kontrollsummeberäkningen täcker alla tabellkolumner. CHECKSUM ger ett fel om någon kolumn har en icke-jämförbar datatyp. Icke-jämförbara datatyper inkluderar:

  • markören
  • image
  • ntext
  • text
  • XML

En annan icke-jämförbar datatyp är sql_variant med någon av de föregående datatyperna som bastyp.

uttryck
Ett uttryck av vilken typ som helst, förutom en icke-jämförbar datatyp.

Returtyper

int

Anmärkningar

CHECKSUM beräknar ett hashvärde, kallat kontrollsumman, över sin argumentlista. Använd detta hashvärde för att bygga hashindex. Ett hashindex uppstår om CHECKSUM funktionen har kolumnargument, och ett index byggs över det beräknade CHECKSUM värdet. Detta kan användas för likhetssökningar över kolumnerna.

Funktionen CHECKSUM uppfyller hashfunktionsegenskaper: CHECKSUM applicerad på två uttryckslistor returnerar samma värde om motsvarande element i de två listorna har samma datatyp, och om dessa element har likhet vid jämförelse med equals (=)-operatorn. Nollvärden av en specificerad typ definieras för att jämföras som lika för CHECKSUM funktionsändamål. Om minst ett av värdena i uttryckslistan ändras, kommer listkontrollsumman troligen att ändras. Detta är dock inte garanterat. Därför rekommenderar vi att du endast använder CHECKSUM om din applikation tål en och annan missad ändring för att upptäcka om värdena har ändrats. Annars, överväg att använda HASHBYTES istället. Med en specificerad MD5-hashalgoritm är sannolikheten att HASHBYTES returnera samma resultat, för två olika indata, mycket lägre jämfört med CHECKSUM.

CHECKSUM ignorerar NCHAR och nvarchar-strecket (N'-' eller nchar(45)). Därför är en hashkollision garanterad för två strängar där de enda skillnaderna är streck. Med andra ord Select checksum(nchar(45)); , och Select checksum(N'-'); båda returnerar värdet , 0så de påverkar inte hashen för några ytterligare tecken i strängen eller någon extra data i kontrollsummelistan. Praktiska problem:

  1. Kontrollsumman ignorerar negativ signatur i numerisk sträng
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. En kontrollsummejämförelse kan inte upptäcka att koden har kommenterats ut i stored proc-definitionen
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 trimmar släpningsutrymmen från Nchar- och Nvarchar-strängar. Effekten är densamma som problemet med ignorerade streck.

Uttrycksordningen påverkar det beräknade CHECKSUM värdet. Ordningen på kolumner som används för CHECKSUM(*) är den ordning av kolumner som anges i tabellen eller vydefinitionen. Detta inkluderar beräknade kolumner.

Värdet CHECKSUM beror på sorteringen. Samma värde som lagras med en annan sortering kommer att returnera ett annat CHECKSUM värde.

CHECKSUM () garanterar inte unika resultat.

Examples

Dessa exempel visar användningen av CHECKSUM för att bygga hashindex.

För att bygga hashindexet lägger det första exemplet till en beräknad kontrollsummekolumn till tabellen vi vill indexera. Den bygger sedan ett index på kontrollsummekolumnen.

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

Detta exempel visar användningen av ett kontrollsummeindex som hashindex. Detta kan hjälpa till att förbättra indexeringshastigheten när kolumnen för att indexera är en lång teckenkolumn. Kontrollsummeindexet kan användas för likhetssökningar.

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

Indexskapande på den beräknade kolumnen materialiserar kontrollsummekolumnen, och eventuella ändringar i ProductName värdet kommer att spridas till kontrollsummekolumnen. Alternativt kan vi bygga ett index direkt på kolumnen vi vill indexera. För långa nyckelvärden kommer dock ett vanligt index troligen inte att prestera lika bra som ett kontrollsummeindex.

Se även

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