Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Относится к:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL analytics endpoint в Microsoft Fabric
Warehouse в Microsoft Fabric
SQL база данных в 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)
ХЭШБАЙТЫ (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)