Поделиться через


CHECKSUM (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL Azure Synapse Analytics в хранилище Microsoft Fabric в Microsoft Fabric

Функция CHECKSUM возвращает значение контрольной суммы, вычисленное для строки таблицы или для списка выражений. Используйте функцию CHECKSUM для построения хэш-индексов.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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

Примечание.

Этот синтаксис не поддерживается бессерверным пулом SQL в Azure Synapse Analytics.

Аргументы

*
Этот аргумент указывает, что вычисление контрольной суммы охватывает все столбцы таблицы. Функция CHECKSUM возвращает ошибку, если какой-либо столбец имеет несопоставимый тип данных. Перечень несопоставимых типов данных:

  • курсор
  • Изображение
  • ntext
  • text
  • XML

Несопоставимым типом данных также является sql_variant с любым из вышеперечисленных типов в качестве базового типа.

выражение
Выражение любого типа, за исключением несопоставимого типа данных.

Типы возвращаемых данных

int

Замечания

Функция CHECKSUM вычисляет хэш-значение, которое называется контрольной суммой, для списка своих аргументов. Используйте это хэш-значение для построения хэш-индексов. Если аргументы функции CHECKSUM являются столбцами, а индекс построен на рассчитанном значении CHECKSUM, то в результате получится хэш-индекс. Он может использоваться для поиска равенств в столбцах.

Функция CHECKSUM удовлетворяет свойствам хэш-функции. Функция CHECKSUM, примененная к любым двум спискам выражений, возвращает одинаковое значение, если при сравнении оператором равенства (=) соответствующие элементы двух списков имеют одинаковый тип и равны. Для данного определения значения NULL указанного типа рассматриваются при сравнении с помощью функции CHECKSUM как равные. Если хотя бы одно из значений в списке выражений меняется, то обычно меняется и контрольная сумма выражений. Однако это не гарантируется. Таким образом, чтобы определить факт изменения значений, рекомендуется использовать функцию CHECKSUM только в том случае, если в вашем приложении допускается случайный пропуск изменений. В противном случае рекомендуется вместо этого использовать функцию HASHBYTES. Когда указан хэш-алгоритм MD5, вероятность возвращения функцией HASHBYTES одинакового результата для двух различных входных параметров намного ниже по сравнению с функцией CHECKSUM.

CHECKSUM игнорирует знак дефиса nchar и nvarchar (N'-' или nchar(45)). Таким образом, конфликт хэша гарантируется для любых двух строк, которые отличаются только дефисами. Иными словами, Select checksum(nchar(45)); и Select checksum(N'-'); возвращают значение 0, поэтому не влияют на хэш дополнительных символов в строке или дополнительные данные в списке контрольной суммы. Практические проблемы:

  1. Контрольная сумма игнорирует отрицательную подпись в числовой строке.
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Сравнение контрольной суммы не может обнаружить, что код был раскомментирован в определении хранимой процедуры.
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 обрезает конечные пробелы в строках типа nchar и nvarchar. Эффект тот же, что и у проблемы игнорируемых дефисов.

Порядок выражений влияет на вычисляемое значение CHECKSUM. Порядок столбцов, используемый с CHECKSUM(*), является порядком столбцов, указанным в таблице или определении представления. Он включает в себя вычисляемые столбцы.

Значение CHECKSUM зависит от параметров сортировки. Такое же значение, сохраненное с другими параметрами сортировки, возвратит другое значение CHECKSUM.

CHECKSUM () не гарантирует уникальные результаты.

Примеры

В этих примерах показывается использование функции CHECKSUM для построения хэш-индексов.

Чтобы построить хэш-индекс, в первом примере в таблицу, которую требуется индексировать, добавляется столбец вычисленной контрольной суммы. После этого создается индекс на основе столбца контрольной суммы.

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

В этом примере показано использование индекса контрольной суммы в качестве хэш-индекса. Это позволяет повысить скорость индексирования в том случае, если столбец индекса содержит длинные символьные значения. Индекс контрольной суммы может быть использован для поиска равенств.

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

Создание индекса по вычисляемому столбцу материализует столбец контрольной суммы, и любые изменения для значения ProductName будут распространены на столбец контрольной суммы. Кроме того, индекс можно построить непосредственно на основе столбца, который требуется индексировать. Тем не менее для ключей с длинными значениями обычный индекс действует не так эффективно, как индекс контрольной суммы.

См. также

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