Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLAzure Synapse Analytics
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Funkce CHECKSUM vrací kontrolní součet vypočítaný přes řádek tabulky nebo přes seznam výrazů. Použijte CHECKSUM k vytváření hash indexů.
Syntaxe
CHECKSUM ( * | expression [ ,...n ] )
Poznámka:
Tato syntaxe není podporována bezserverovým fondem SQL ve službě Azure Synapse Analytics.
Arguments
*
Tento argument specifikuje, že výpočet kontrolního součtu pokrývá všechny sloupce tabulky.
CHECKSUM vrací chybu, pokud má nějaký sloupec nesrovnatelný datový typ. Nesrovnatelné typy dat zahrnují:
- kurzoru
- image
- ntext
- text
- XML
Dalším nesrovnatelným datovým typem je sql_variant s některým z předchozích datových typů jako jeho základním typem.
expression
Výraz jakéhokoliv typu, kromě nesrovnatelného datového typu.
Návratové typy
int
Poznámky
CHECKSUM vypočítá hash hodnotu, nazývanou kontrolní součet, nad svým seznamem argumentů. Použijte tuto hash hodnotu k vytvoření hash indexů. Hash index vznikne, pokud CHECKSUM má funkce sloupcové argumenty, a index je vytvořen nad vypočítanou hodnotou CHECKSUM . To lze použít pro vyhledávání rovnosti ve sloupcích.
Funkce CHECKSUM splňuje vlastnosti hashovací funkce: CHECKSUM aplikovaná na libovolné dva seznamy výrazů vrátí stejnou hodnotu, pokud odpovídající prvky obou seznamů mají stejný datový typ a pokud mají tyto prvky rovnost při porovnání pomocí operátoru equals (=). Nulové hodnoty určitého typu jsou definovány tak, aby se mohly porovnávat jako stejné pro CHECKSUM účely funkce. Pokud se alespoň jedna z hodnot v seznamu výrazů změní, kontrolní součet seznamu se pravděpodobně změní. To však není zaručeno.
Proto doporučujeme používat pouze CHECKSUM tehdy, pokud vaše aplikace snese občasné přehlédnutí změny. Jinak zvažte použití HASHBYTES místo toho. S definovaným MD5 hashovacím algoritmem je pravděpodobnost, že HASHBYTES vrátí stejný výsledek pro dva různé vstupy, mnohem nižší než CHECKSUM.
CHECKSUM Ignoruje znak Nchar a Nvarchar Dash (N'-' nebo nchar(45)). Proto je shoda hashu zaručena pro libovolné dva řetězce, kde jsou jediné rozdíly pomlčky. Jinými slovy, Select checksum(nchar(45));Select checksum(N'-'); oba vracejí hodnotu 0, takže nemají vliv na hash dalších znaků v řetězci ani na další data v kontrolním součtu.
Praktické problémy:
- Kontrolní součet ignoruje zápornou signaturu v číselném řetězci
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
- Porovnání kontrolních součtů nemůže zjistit, že kód byl komentován v uložené definici proc
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 Ořezy sledují mezery od strun Nchar a Nvarchar. Efekt je stejný jako problém ignorovaných pomlček.
Pořadí výrazů ovlivňuje vypočítanou hodnotu CHECKSUM . Pořadí sloupců použitých pro CHECKSUM(*) je pořadí sloupců specifikované v definici tabulky nebo pohledu. To zahrnuje i vypočítané sloupce.
Hodnota CHECKSUM závisí na třídění. Stejná hodnota uložená s jinou kolecí vrátí jinou CHECKSUM hodnotu.
CHECKSUM () To však nezaručuje jedinečné výsledky.
Examples
Tyto příklady ukazují použití k CHECKSUM vytváření hash indexů.
Pro vytvoření hashovacího indexu první příklad přidá do tabulky, kterou chceme indexovat, sloupec s vypočteným kontrolním součtem. Poté vytvoří index na sloupci kontrolního součtu.
-- 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
Tento příklad ukazuje použití indexu kontrolního součtu jako hashovacího indexu. To může pomoci zlepšit rychlost indexování, když je sloupec pro indexování dlouhý sloupec znaků. Index kontrolního součtu lze použít pro vyhledávání rovnosti.
/*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
Vytvoření indexu na vypočítaném sloupci materializuje sloupec kontrolního součtu a jakékoli změny ProductName hodnoty se přenesou do sloupce kontrolního součtu. Alternativně bychom mohli vytvořit index přímo na sloupci, který chceme indexovat. Nicméně u dlouhých klíčových hodnot pravděpodobně běžný index nebude fungovat tak dobře jako kontrolní součt.
Viz také
CHECKSUM_AGG (Transact-SQL)
HASHBYTES (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)