Compartilhar via


CHECKSUM (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Ponto de extremidade de análises SQL no Microsoft Fabric Warehouse no Microsoft Fabric

A função CHECKSUM retorna o valor de soma de verificação computado em uma linha da tabela, ou em uma lista de expressões. Use CHECKSUM para criar índices de hash.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Observação

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

Argumentos

*
Esse argumento especifica que o cálculo da soma de verificação abrange todas as colunas de tabela. CHECKSUM retorna um erro se uma coluna tem um tipo de dados não comparável. Os tipos de dados não comparáveis incluem:

  • cursor
  • imagem
  • ntext
  • text
  • XML

Outro tipo de dados não comparável é sql_variant com qualquer um dos tipos de dados anteriores como seu tipo base.

expressão
Uma expression de qualquer tipo, com exceção de um tipo de dados não comparável.

Tipos de retorno

int

Comentários

CHECKSUM calcula um valor de hash, chamado de soma de verificação, em sua lista de argumentos. Use esse valor de hash para criar índices de hash. Um índice de hash ocorrerá se a função CHECKSUM tiver argumentos de coluna e um índice for criado com base no valor de CHECKSUM calculado. Isso pode ser usado para pesquisas de igualdade em colunas.

A função CHECKSUM atende às propriedades da função de hash: CHECKSUM aplicado a duas listas de expressões retornarão o mesmo valor se os elementos correspondentes das duas listas tiverem o mesmo tipo de dados e se esses elementos correspondentes tiverem igualdade quando comparados com o operador de igualdade (=). Valores nulos de um tipo especificado são definidos para serem comparados como iguais para fins da função CHECKSUM. Se pelo menos um dos valores na lista de expressões for alterado, a soma de verificação de lista provavelmente será alterada. No entanto, isso não é garantido. Portanto, para detectar se os valores foram alterados, recomendamos o uso de CHECKSUM somente se o aplicativo puder tolerar uma alteração ausente ocasional. Caso contrário, considere a possibilidade de usar o HASHBYTES. Com um algoritmo de hash MD5 especificado, a probabilidade de que HASHBYTES retornará o mesmo resultado para duas entradas diferentes é muito menor em comparação com CHECKSUM.

CHECKSUM ignora o caractere de traço de nchar e nvarchar (N'-' ou nchar(45)). Portanto, uma colisão de hash é garantida para duas cadeias de caracteres em que as únicas diferenças são traços. Em outras palavras, Select checksum(nchar(45)); e Select checksum(N'-'); retornam um valor de 0, de modo que não têm nenhum efeito no hash de nenhum caractere adicional na cadeia de caracteres nem dados adicionais na lista de soma de verificação. Problemas práticos:

  1. A soma de verificação ignora a assinatura negativa na cadeia de caracteres numérica
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Uma comparação de soma de verificação não pode detectar que o código foi comentado na definição do proc armazenado
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 corta espaços à direita de cadeias de caracteres nchar e nvarchar. O efeito é o mesmo que o do problema de traços ignorados.

A ordem de expressão afeta o valor CHECKSUM computado. A ordem das colunas usada para CHECKSUM(*) é a mesma especificada na definição de tabela ou exibição. Isso inclui as colunas computadas.

O valor de CHECKSUM depende da ordenação. O mesmo valor armazenado com uma ordenação diferente retornará um valor de CHECKSUM diferente.

CHECKSUM () não garante resultados exclusivos.

Exemplos

Estes exemplos mostram o uso de CHECKSUM para criar índices de hash.

Para criar o índice de hash, o primeiro exemplo adiciona uma coluna de soma de verificação computada à tabela que você deseja indexar. Em seguida, ele cria um índice na coluna de soma de verificação.

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

Este exemplo mostra o uso de um índice de soma de verificação como um índice de hash. Isso pode ajudar a melhorar a velocidade de indexação quando a coluna a ser indexada é uma coluna de caracteres longa. O índice de soma de verificação pode ser usado para pesquisas de igualdade.

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

A criação do índice na coluna computada materializa a coluna de soma de verificação e todas as alterações no valor de ProductName serão propagadas para a coluna de soma de verificação. Como alternativa, podemos criar um índice diretamente na coluna que desejamos indexar. No entanto, para valores de chave longos, um índice normal provavelmente não terá o mesmo desempenho que um índice de soma de verificação.

Veja também

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