Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy do:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Endpoint analityki SQL w Microsoft Fabric
Magazyn w Microsoft Fabric
Baza danych SQL w Microsoft Fabric
Funkcja CHECKSUM zwraca wartość kontrolną sumy obliczoną na wierszu tabeli lub na liście wyrażeń. Używaj CHECKSUM do budowania indeksów skrótów.
Transact-SQL konwencje składni
Składnia
CHECKSUM ( * | expression [ ,...n ] )
Uwaga / Notatka
Ta składnia nie jest obsługiwana przez bezserwerową pulę SQL w usłudze Azure Synapse Analytics.
Arguments
*
Argument ten określa, że obliczenia sumy kontrolnej obejmują wszystkie kolumny tabeli.
CHECKSUM zwraca błąd, jeśli dowolna kolumna ma nieporównywalny typ danych. Nieporównywalne typy danych obejmują:
- kursor
- image
- ntext
- tekst
- XML
Innym nieporównywalnym typem danych jest sql_variant z dowolnym z poprzednich typów danych jako typem bazowym.
expression
Wyrażenie dowolnego typu, z wyjątkiem nieporównywalnego typu danych.
Typy zwracane
int
Uwagi
CHECKSUM oblicza wartość skrótu, zwaną sumą kontrolną, na swojej liście argumentów. Użyj tej wartości skrótu do budowy indeksów skrótu. Indeks skrótu powstanie, jeśli CHECKSUM funkcja ma argumenty kolumnowe, a indeks zostanie zbudowany na podstawie obliczonej CHECKSUM wartości. Może to być używane do wyszukiwania równości w kolumnach.
Funkcja CHECKSUM spełnia właściwości funkcji skrótu: CHECKSUM zastosowana na dowolnych dwóch listach wyrażeń zwróci tę samą wartość, jeśli odpowiadające im elementy obu list mają ten sam typ danych oraz jeśli te elementy mają równość przy użyciu operatora równego (=). Wartości zerowe określonego typu są definiowane tak, aby porównywać je jako równe dla CHECKSUM celów funkcyjnych. Jeśli przynajmniej jedna z wartości w liście wyrażeń się zmieni, suma kontrolna listy prawdopodobnie się zmieni. Jednak nie jest to gwarantowane.
Dlatego, aby wykryć, czy wartości się zmieniły, zalecamy stosowanie tylko CHECKSUM wtedy, gdy Twoja aplikacja może znieść sporadyczne pominięcie zmian. W przeciwnym razie rozważ użycie HASHBYTES zamiast tego. Przy określonym algorytmie skrótu MD5 prawdopodobieństwo HASHBYTES zwrócenia tego samego wyniku dla dwóch różnych wejść jest znacznie niższe w porównaniu do .CHECKSUM
CHECKSUM Ignoruje znak Nchar i Nvarchar Dash (N'-' lub nchar(45)). Dlatego kolizja skrótu jest gwarantowana dla dowolnych dwóch ciągów, gdzie jedynymi różnicami są kreski. Innymi słowy, Select checksum(nchar(45));Select checksum(N'-'); oba zwracają wartość 0, więc nie mają wpływu na skrót dodatkowych znaków w ciągu ani na dodatkowe dane z listy sum kontrolnych.
Problemy praktyczne:
- Suma kontrolna ignoruje ujemny podpis w ciągu liczbowym
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
- Porównanie sum kontrolnych nie może wykryć, że kod został skomentowany w zapisanej definicji procedury
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 Przycina przestrzeni po strunach Nchar i Nvarchar. Efekt jest taki sam jak problem ignorowania myślników.
Kolejność wyrażeń wpływa na obliczoną CHECKSUM wartość. Kolejność kolumn używana dla CHECKSUM(*) to kolejność kolumn określona w definicji tabeli lub widoku. Dotyczy to także kolumn obliczeniowych.
Wartość CHECKSUM zależy od sortowania. Ta sama wartość przechowywana przy innej sortacji zwraca inną CHECKSUM wartość.
CHECKSUM () nie gwarantuje unikalnych rezultatów.
Przykłady
Te przykłady pokazują zastosowanie do CHECKSUM budowy indeksów skrótów.
Aby zbudować indeks skrótu, pierwszy przykład dodaje obliczoną kolumnę sumy kontrolnej do tabeli, którą chcemy indeksować. Następnie buduje indeks na kolumnie sumy kontrolnej.
-- 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
Ten przykład pokazuje użycie indeksu sumy kontrolnej jako indeksu skrótu. Może to pomóc poprawić szybkość indeksowania, gdy kolumna do indeksowania jest długą kolumną znaków. Indeks sumy kontrolnej może być używany do wyszukiwania równości.
/*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
Tworzenie indeksu na obliczonej kolumnie materializuje kolumnę sumy kontrolnej, a wszelkie zmiany ProductName wartości są przekazywane do kolumny sumy kontrolnej. Alternatywnie możemy zbudować indeks bezpośrednio na kolumnie, którą chcemy indeksować. Jednak dla długich wartości klucza indeks zwykły prawdopodobnie nie będzie radził sobie tak dobrze jak indeks sumy kontrolnej.
Zobacz także
CHECKSUM_AGG (Transact-SQL)
HASHBYTES (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)