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
, поэтому не влияют на хэш дополнительных символов в строке или дополнительные данные в списке контрольной суммы.
Практические проблемы:
- Контрольная сумма игнорирует отрицательную подпись в числовой строке.
SELECT CHECKSUM(N'1'), CHECKSUM(N'-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)