CHECKSUM (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPunto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

La función CHECKSUM devuelve el valor de la suma de comprobación calculado sobre una fila de una tabla o sobre una lista de expresiones. Use CHECKSUM para generar índices hash.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulta la Documentación de versiones anteriores.

Nota:

El grupo de SQL sin servidor no admite esta sintaxis en Azure Synapse Analytics.

Argumentos

*
Este argumento especifica que el cálculo de la suma de comprobación cubre todas las columnas de la tabla. CHECKSUM devuelve un error si alguna columna tiene un tipo de datos no comparable. Entre los tipos de datos no comparables están los siguientes:

  • cursor
  • image
  • ntext
  • text
  • XML

Otro tipo de datos no comparable es sql_variant con cualquiera de los tipos de datos anteriores como tipo base.

expression
Una expresión de cualquier tipo, excepto un tipo de datos no comparable.

Tipos de valores devueltos

int

Observaciones

CHECKSUM calcula un valor hash, denominado suma de comprobación, sobre su lista de argumentos. Use este valor hash para generar índices hash. Se generará un índice hash si la función CHECKSUM tiene argumentos de columna y se crea un índice sobre el valor CHECKSUM calculado. Éste se puede utilizar para búsquedas de igualdades sobre las columnas.

La función CHECKSUM cumple las propiedades de una función hash: si se aplica CHECKSUM sobre dos listas de expresiones, se devolverá el mismo valor si los elementos correspondientes de ambas listas tienen el mismo tipo de datos y estos elementos son iguales cuando se comparan con el operador igual (=). Se definen valores NULL de un tipo especificado para compararse como iguales con fines de la función CHECKSUM. Si al menos uno de los valores de la lista de expresiones cambia, la suma de comprobación de la lista probablemente cambiará, aunque dicho extremo no está garantizado. Por lo tanto, para detectar si los valores han cambiado, se recomienda usar CHECKSUM solo si su aplicación puede tolerar una posible ausencia de cambio. De lo contrario, es más aconsejable usar HASHBYTES. Con un algoritmo hash MD5 específico, la probabilidad de que HASHBYTES devuelva el mismo resultado (de dos entradas diferentes) es mucho menor en comparación con CHECKSUM.

CHECKSUM omite el carácter de guion nchar y nvarchar (N'-' o nchar(45)). Por lo tanto, está garantizada una colisión de hash para dos cadenas cualesquiera en las que las únicas diferencias sean los guiones. Dicho de otro modo, tanto Select checksum(nchar(45)); como Select checksum(N'-'); devuelven un valor de 0, por lo que no tienen ningún efecto en el hash de los caracteres adicionales de la cadena o en los datos adicionales de la lista de suma de comprobación. Problemas prácticos:

  1. La suma de comprobación omite la firma negativa en una cadena numérica.
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Una comparación de suma de comprobación no puede detectar que el código se ha comentado en la definición del procedimiento almacenado.
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 recorta los espacios finales de las cadenas nchar y nvarchar. El efecto es el mismo que en el caso del problema de los guiones omitidos.

El orden de las expresiones afecta al valor CHECKSUM calculado. El orden de las columnas usado para CHECKSUM(*) es el orden de las columnas especificado en la definición de la tabla o la vista. Esto incluye las columnas calculadas.

El valor de CHECKSUM depende de la intercalación. El mismo valor almacenado con una intercalación diferente devolverá un valor de CHECKSUM diferente.

CHECKSUM () no garantiza resultados únicos.

Ejemplos

En estos ejemplos se muestra el uso de CHECKSUM para generar índices hash.

Para crear el índice hash, en el primer ejemplo se agrega una columna de suma de comprobación calculada a la tabla que se quiere indizar. Luego se crea un índice en la columna de la suma de comprobación.

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

En este ejemplo se muestra el uso de un índice de suma de comprobación como índice hash. Esto puede ayudar a mejorar la velocidad de indización cuando la columna que se quiere indizar es una columna de cadenas largas de caracteres. El índice de suma de comprobación se puede utilizar para búsquedas de igualdades.

/*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 creación del índice en la columna calculada se materializa en la columna de suma de comprobación y cualquier cambio en el valor de ProductName se propagará a la columna de suma de comprobación. Como alternativa se puede crear un índice directamente en la columna que se quiere indizar, aunque para los valores de clave largos es probable que un índice normal no se comporte tan bien como un índice de suma de comprobación.

Consulte también

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