Condividi tramite


CHECKSUM (Transact-SQL)

Restituisce il valore di checksum calcolato su una riga di una tabella o su un elenco di espressioni. La funzione CHECKSUM viene utilizzata per la compilazione di indici hash.

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • *
    Specifica che il calcolo viene eseguito su tutte le colonne della tabella. Se il tipo di dati di una colonna non è confrontabile, la funzione CHECKSUM restituisce un errore. I tipi di dati non confrontabili sono text, ntext, image, XML e cursor, nonché sql_variant quando il relativo tipo di base è uno dei tipi precedenti.

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

Tipi restituiti

int

Osservazioni

La funzione CHECKSUM calcola un valore hash, denominato checksum, sul relativo elenco di argomenti. Tale valore viene utilizzato per la compilazione di indici hash. Se gli argomenti di CHECKSUM sono colonne e viene compilato un indice sul valore calcolato di CHECKSUM, 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 in quanto quando viene applicata su due qualsiasi elenchi di espressioni 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 (=). In questo contesto, i valori Null di un tipo specificato vengono considerati uguali ai fini del confronto. Se uno dei valori nell'elenco di espressioni cambia, in genere cambia anche il valore di checksum dell'elenco. È comunque possibile che il valore di checksum rimanga invariato. Per questo motivo, non è consigliabile utilizzare CHECKSUM per rilevare se i valori sono stati modificati a meno che l'applicazione non possa tollerare l'occasionale omissione di una modifica. Prendere invece in considerazione l'utilizzo di HashBytes. Quando viene specificato un algoritmo hash MD5, le probabilità che HashBytes restituisca lo stesso risultato per due diversi input sono notevolmente inferiori rispetto a CHECKSUM.

L'ordine delle espressioni influisce sul risultato di CHECKSUM. L'ordine delle colonne utilizzate con CHECKSUM(*) corrisponde all'ordine delle colonne specificate nella definizione della tabella o della vista, incluse le colonne calcolate.

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

Esempi

Negli esempi seguenti viene illustrato l'utilizzo di CHECKSUM per la compilazione di indici hash. L'indice hash viene compilato tramite l'aggiunta di una colonna checksum alla tabella da indicizzare e quindi tramite la compilazione di un indice su questa colonna.

-- Create a checksum index.
SET ARITHABORT ON;
USE AdventureWorks2012; 
GO
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO

L'indice checksum può essere utilizzato come indice hash, soprattutto per migliorare la velocità di indicizzazione quando la colonna da indicizzare è 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, è possibile compilare un indice direttamente sulla colonna indicizzata. Se, tuttavia, i valori di chiave sono di tipo Long, è probabile che le prestazioni ottenute con un indice checksum siano migliori.

Vedere anche

Riferimento

CHECKSUM_AGG (Transact-SQL)

HASHBYTES (Transact-SQL)

BINARY_CHECKSUM (Transact-SQL)