Condividi tramite


BINARY_CHECKSUM (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsEndpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft FabricDatabase SQL in Microsoft Fabric

Restituisce il valore di checksum binario calcolato su una riga di una tabella o su un elenco di espressioni.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Nota

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

Argomenti

*

Specifica che il calcolo viene eseguito su tutte le colonne della tabella. BINARY_CHECKSUM ignora colonne di tipi di dati non comparabili nel suo calcolo. I tipi di dati non comparabili includono:

  • cursor
  • Immagine
  • ntext
  • Testo
  • xml
  • Tipi definiti dall'utente non comparabili in tempo di esecuzione del linguaggio comune (CLR)

expression

Espressione di qualsiasi tipo. BINARY_CHECKSUM ignora le espressioni di tipi di dati non comparabili nel suo calcolo.

Tipi restituiti

int

Osservazioni:

Il calcolo di BINARY_CHECKSUM(*) su qualsiasi riga di una tabella restituisce sempre lo stesso valore, a meno che la riga non venga modificata in un secondo momento. BINARY_CHECKSUM soddisfa le proprietà di una funzione hash: quando applicata su due liste di espressioni qualsiasi, restituisce lo stesso valore se gli elementi corrispondenti delle due liste hanno lo stesso tipo e sono uguali se confrontati usando l'operatore uguale (=).

In questo contesto, si dice che i valori Null di un tipo specificato vengono considerati uguali ai fini del confronto. Se almeno uno dei valori nell'elenco di espressioni cambia, anche il valore di checksum dell'espressione può cambiare. Tuttavia, questa modifica non è garantita, quindi per rilevare se i valori sono cambiati, dovresti usarla BINARY_CHECKSUM solo se la tua applicazione può tollerare eventuali cambiamenti mancati. In caso contrario, prendere in considerazione l'uso di HASHBYTES. Con un algoritmo di hash MD5 specificato, la probabilità che HASHBYTES restituisca lo stesso risultato, per due input diversi, è molto inferiore a BINARY_CHECKSUM.

BINARY_CHECKSUM può essere eseguito su un elenco di espressioni e restituisce lo stesso valore per un elenco specificato. Se si applica BINARY_CHECKSUM a due elenchi di espressioni, viene restituito lo stesso valore se agli elementi corrispondenti dei due elenchi sono associati lo stesso tipo di dati e la stessa rappresentazione di byte. Per questa definizione, si presume che ai valori Null di un determinato tipo sia associata la stessa rappresentazione di byte.

BINARY_CHECKSUM e CHECKSUM sono funzioni simili. Consentono infatti di calcolare un valore di checksum in un elenco di espressioni, il cui ordine determina il valore restituito. L'ordine delle colonne usate per BINARY_CHECKSUM(*) corrisponde all'ordine delle colonne specificato nella definizione della tabella o della vista, incluse le colonne calcolate.

BINARY_CHECKSUM e CHECKSUM restituiscono valori diversi per i tipi di dati stringa, in cui a seconda delle impostazioni locali le stringhe con rappresentazione diversa possono risultare uguali. I tipi di dati della stringa sono:

  • char
  • nchar
  • nvarchar
  • varchar
  • sql_variant (se il tipo base di sql_variant è un tipo di dato a stringa)

Ad esempio, le stringhe McCavity e Mccavity hanno valori diversi BINARY_CHECKSUM . In un server in cui la distinzione tra maiuscole e minuscole è irrilevante, invece, CHECKSUM restituisce gli stessi valori di checksum per queste stringhe. È consigliabile evitare il confronto di valori CHECKSUM con valori BINARY_CHECKSUM.

BINARY_CHECKSUMSupporta qualsiasi lunghezza di tipo varbinary(max) e fino a 255 caratteri di tipo nvarchar(n) / nvarchar(max).

Esempi

Nell'esempio seguente la funzione BINARY_CHECKSUM viene usata per rilevare le modifiche in una riga di tabella.

USE AdventureWorks2022;
GO

CREATE TABLE myTable (column1 INT, column2 VARCHAR (256));
GO

INSERT INTO myTable VALUES (1, 'test');
GO

SELECT BINARY_CHECKSUM(*) FROM myTable;
GO

UPDATE myTable SET column2 = 'TEST';
GO

SELECT BINARY_CHECKSUM(*) FROM myTable;
GO