Partilhar via


SOMA DE VERIFICAÇÃO (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

A CHECKSUM função devolve o valor da soma de verificação calculado sobre uma linha de tabela ou sobre uma lista de expressões. Use CHECKSUM para construir índices de hash.

Transact-SQL convenções de sintaxe

Sintaxe

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

Observação

Essa sintaxe não é suportada pelo pool SQL sem servidor no Azure Synapse Analytics.

Arguments

*
Este argumento especifica que o cálculo da soma de verificação cobre todas as colunas da tabela. CHECKSUM retorna um erro se alguma coluna tiver um tipo de dado não comparável. Tipos de dados não comparáveis incluem:

  • Cursor
  • image
  • ntext
  • texto
  • XML

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

expressão
Uma expressão de qualquer tipo, exceto um tipo de dado não comparável.

Tipos de devolução

int

Observações

CHECKSUM calcula um valor hash, chamado de soma de verificação, sobre a sua lista de argumentos. Use este valor de hash para construir índices de hash. Resultará um índice de hash se a CHECKSUM função tiver argumentos de coluna e um índice for construído sobre o valor calculado CHECKSUM . Isto pode ser usado para pesquisas de igualdade sobre as colunas.

A CHECKSUM função satisfaz as propriedades da função hash: CHECKSUM aplicada a quaisquer duas listas de expressões devolverá o mesmo valor se os elementos correspondentes das duas listas tiverem o mesmo tipo de dado e se esses elementos correspondentes tiverem igualdade quando comparados usando o operador igual (=). Valores nulos de um tipo especificado são definidos para comparar como iguais para CHECKSUM efeitos de função. Se pelo menos um dos valores na lista de expressões mudar, a soma de verificação da lista provavelmente mudará. No entanto, isso não é garantido. Portanto, para detetar se os valores mudaram, recomendamos a utilização apenas CHECKSUM se a sua aplicação conseguir tolerar uma alteração ocasional em falta. Caso contrário, considere usar HASHBYTES em vez disso. Com um algoritmo de hash MD5 especificado, a probabilidade de HASHBYTES devolver o mesmo resultado, para duas entradas diferentes, é muito menor comparada com CHECKSUM.

CHECKSUM Ignora a personagem nchar e nvarchar dash (N'-' ou nchar(45)). Portanto, uma colisão de hash é garantida para quaisquer duas cadeias onde as únicas diferenças são os traços. Por outras palavras, Select checksum(nchar(45));Select checksum(N'-'); ambos retornam um valor de 0, para que não tenham efeito no hash de quaisquer caracteres adicionais na cadeia ou em quaisquer dados adicionais na lista de soma de verificação. Problemas práticos:

  1. A soma de verificação ignora assinatura negativa na cadeia numérica
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Uma comparação de checksum não pode detetar que o código foi comentado na definição de 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 Apara os espaços traseiros das cordas NCAR e Nvarchar. O efeito é o mesmo que o problema dos traços ignorados.

A ordem de expressão afeta o valor calculado CHECKSUM . A ordem das colunas usada para CHECKSUM(*) é a ordem das colunas especificada na definição da tabela ou da vista. Isto inclui colunas calculadas.

O CHECKSUM valor depende da colação. O mesmo valor armazenado com uma colação diferente devolverá um valor diferente CHECKSUM .

CHECKSUM () não garante resultados únicos.

Examples

Estes exemplos mostram a utilização de CHECKSUM para construir índices de hash.

Para construir o índice de hash, o primeiro exemplo adiciona uma coluna de soma de verificação calculada à tabela que queremos indexar. Depois, constrói 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 a utilização de um índice de soma de verificação como índice de hash. Isto pode ajudar a melhorar a velocidade de indexação quando a coluna para o índice é 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 de índice na coluna calculada materializa a coluna de soma de verificação, e quaisquer alterações ao ProductName valor propagam-se para a coluna de soma de verificação. Alternativamente, poderíamos construir um índice diretamente sobre a coluna que queremos indexar. No entanto, para valores de chave longos, um índice regular provavelmente não terá um desempenho tão bom quanto um índice de soma de controlo.

Consulte também

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