Compartilhar via


BINARY_CHECKSUM (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL analytics endpoint no Microsoft FabricWarehouse no Microsoft FabricBanco de dados SQL no Microsoft Fabric

Retorna o valor binário da soma de verificação calculado em uma linha de tabela ou em uma lista de expressões.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Observação

Não há suporte a essa sintaxe para o pool de SQL sem servidor no Azure Synapse Analytics.

Argumentos

*

Especifica que a computação abrange todas as colunas da tabela. BINARY_CHECKSUM ignora colunas de tipos de dados não comparáveis em seu cálculo. Tipos de dados não comparáveis incluem:

  • cursor
  • imagem
  • ntext
  • text
  • xml
  • tipos definidos pelo usuário em tempo comum de execução de linguagem comum (CLR) não comparáveis

expressão

Uma expression de qualquer tipo. BINARY_CHECKSUM ignora expressões de tipos de dados não comparáveis em seu cálculo.

Tipos de retorno

int

Comentários

BINARY_CHECKSUM(*), calculado em qualquer linha de uma tabela, retorna o mesmo valor contanto que a linha não seja modificada posteriormente. BINARY_CHECKSUM satisfaz as propriedades de uma função hash: quando aplicada sobre quaisquer duas listas de expressões, ela retorna o mesmo valor se os elementos correspondentes das duas listas tiverem o mesmo tipo e forem iguais quando comparados usando o operador de igual (=).

Para essa definição, dizemos que valores nulos, de um tipo especificado, são comparados como valores iguais. Se, pelo menos, um dos valores na lista de expressões for alterado, a soma de verificação da expressão também poderá ser alterada. No entanto, essa mudança não é garantida, então, para detectar se os valores mudaram, você deve usar BINARY_CHECKSUM apenas se sua aplicação tolerar uma alteração ocasional que tenha sido ignorada. Caso contrário, considere a possibilidade de usar o HASHBYTES. Com um algoritmo de hash MD5 especificado, a probabilidade de que HASHBYTES retorne o mesmo resultado, para duas entradas diferentes, é muito menor que BINARY_CHECKSUM.

BINARY_CHECKSUM pode operar sobre uma lista de expressões e retorna o mesmo valor para uma lista especificada. BINARY_CHECKSUM aplicado sobre duas listas de expressões retorna o mesmo valor se os elementos correspondentes das duas listas tiverem o mesmo tipo e representação de byte. Nessa definição, os valores nulos de um tipo especificado são considerados como possuidores da mesma representação de byte.

BINARY_CHECKSUM e CHECKSUM são funções semelhantes. Elas podem ser usadas para calcular um valor de soma em uma lista de expressões e a ordem das expressões afeta o valor resultante. A ordem das colunas usada para BINARY_CHECKSUM(*) é a mesma especificada na definição de tabela ou exibição. Essa ordem inclui as colunas computadas.

BINARY_CHECKSUM e CHECKSUM retornam valores diferentes para os tipos de dados de cadeia de caracteres, em que a localidade pode fazer com que as cadeias de caracteres com uma representação diferente sejam comparadas como iguais. Os tipos de dados em cadeia são:

  • char
  • nchar
  • nvarchar
  • varchar
  • sql_variant (se o tipo base de sql_variant for um tipo de dado de string)

Por exemplo, as cadeias McCavity e Mccavity têm valores diferentes BINARY_CHECKSUM . Por outro lado, para um servidor que não diferencia maiúsculas de minúsculas, CHECKSUM retorna os mesmos valores de soma de verificação para essas cadeias de caracteres. Você deve evitar a comparação dos valores de CHECKSUM com os valores de BINARY_CHECKSUM.

BINARY_CHECKSUMsuporta qualquer comprimento de tipo varbinary(max) e até 255 caracteres do tipo nvarchar(n) / nvarchar(max).

Exemplos

Este exemplo usa BINARY_CHECKSUM para detectar as alterações em uma linha da tabela.

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