CHECKSUM (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Endpoint di analisi SQL di Azure Synapse Analyticsin Microsoft FabricWarehouse in Microsoft Fabric

La funzione CHECKSUM restituisce il valore di checksum calcolato su una riga di una tabella o su un elenco di espressioni. Usare CHECKSUM per compilare indici hash.

Convenzioni di sintassi Transact-SQL

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Nota

Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics.

Argomenti

*
Questo argomento specifica che il calcolo del valore di checksum copre tutte le colonne di tabella. Se una colonna contiene un tipo di dati non confrontabile, CHECKSUM restituisce un errore. I tipi di dati non confrontabili includono:

  • cursor
  • Immagine
  • ntext
  • text
  • XML

Un altro tipo di dati non confrontabile è sql_variant con uno qualsiasi dei tipi di dati precedenti come tipo di base.

expression
Espressione di qualsiasi tipo, esclusi i tipi di dati non confrontabili.

Tipi restituiti

int

Osservazioni:

CHECKSUM calcola un valore hash, denominato checksum, sul relativo elenco di argomenti. Usare questo valore hash per la creazione degli indici hash. Se la funzione CHECKSUM ha argomenti di colonna e viene compilato un indice sul valore di CHECKSUM calcolato, il risultato sarà un indice hash, che può essere utilizzato per eseguire ricerche di uguaglianza sulle colonne.

La funzione CHECKSUM soddisfa le proprietà di una funzione hash: quando CHECKSUM viene applicata su due elenchi di espressioni qualsiasi restituisce lo stesso valore se gli elementi corrispondenti dei due elenchi sono dello stesso tipo di dati e risultano uguali quando vengono confrontati tramite l'operatore di uguaglianza (=). Ai fini della funzione CHECKSUM, i valori Null di un tipo specificato vengono considerati uguali ai fini del confronto. Se almeno uno dei valori nell'elenco di espressioni cambia, è probabile che cambi anche il valore di checksum dell'elenco. Questo comportamento non è tuttavia garantito. Per rilevare se i valori sono stati modificati, è pertanto consigliabile usare CHECKSUM solo se l'applicazione può tollerare una modifica mancata occasionale. In caso contrario, prendere in considerazione l'uso di HASHBYTES. In presenza di un algoritmo hash MD5 specificato, le probabilità che HASHBYTES restituisca lo stesso risultato per due diversi input sono notevolmente inferiori rispetto a CHECKSUM.

CHECKSUM ignora il carattere trattino di nchar e nvarchar (N'-' o nchar(45)). Pertanto, è garantita la collisione hash per due stringhe in cui le uniche differenze sono i trattini. In altre parole, Select checksum(nchar(45)); e Select checksum(N'-'); restituiscono entrambi il valore 0, quindi non hanno alcun effetto sull'hash di eventuali caratteri aggiuntivi nella stringa o di eventuali dati aggiuntivo nell'elenco di checksum. Problemi pratici:

  1. Il checksum ignora la firma negativa nella stringa numerica
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Un confronto di checksum non è in grado di rilevare che il codice è stato impostato come commento nella definizione della stored procedure
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 elimina gli spazi finali dalle stringhe nchar e nvarchar. L'effetto è lo stesso del problema dei trattini ignorati.

L'ordine di espressione influisce sul valore CHECKSUM calcolato. L'ordine delle colonne usate per CHECKSUM(*) corrisponde all'ordine delle colonne specificato nella definizione della tabella o della vista, incluse le colonne calcolate.

Il valore di CHECKSUM dipende dalle regole di confronto. Lo stesso valore archiviato con regole di confronto diverse restituirà un valore di CHECKSUM diverso.

CHECKSUM () non garantisce risultati univoci.

Esempi

Negli esempi seguenti viene illustrato l'uso di CHECKSUM per compilare indici hash.

Per compilare l'indice hash, il primo esempio aggiunge una colonna checksum calcolata alla tabella che si vuole indicizzare. Compila quindi un indice sulla colonna checksum.

-- 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 questo esempio viene illustrato l'uso di un indice checksum come indice hash. In questo modo si può migliorare la velocità di indicizzazione quando la colonna da indicizzare è una colonna di tipo carattere long. Può inoltre essere utilizzato per l'esecuzione di ricerche di uguaglianza.

/*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 creazione dell'indice sulla colonna calcolata materializza la colonna checksum, alla quale verranno propagate tutte le modifiche apportate al valore ProductName. In alternativa, si potrebbe compilare un indice direttamente nella colonna che si vuole indicizzare. Per i valori di chiave lunghi un normale indice probabilmente non offrirà prestazioni soddisfacenti quanto un indice checksum.

Vedi anche

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