Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
A CHECKSUM függvény visszaadja a táblázatsoron vagy egy kifejezéslistán kiszámított ellenőrző összeget. Hash indexek építésére használjuk CHECKSUM .
Transact-SQL szintaxis konvenciók
Szemantika
CHECKSUM ( * | expression [ ,...n ] )
Megjegyzés:
Ezt a szintaxist az Azure Synapse Analytics kiszolgáló nélküli SQL-készlete nem támogatja.
Arguments
*
Ez az érv azt határozza meg, hogy az ellenzőösszeg számítása lefedi az összes táblaoszlopot.
CHECKSUM hibát ad, ha bármely oszlopnak nincs összehasonlíthatatlan adattípusa. Nem összehasonlítható adattípusok a következők:
- kurzor
- image
- kontextus
- text
- XML
Egy másik nem összehasonlítható adattípus sql_variant , amelynek alaptípusa bármelyik előző adattípus van.
kifejezés
Bármilyen típusú kifejezés , kivéve egy nem összehasonlítható adattípust.
Visszatérési típusok
int
Megjegyzések
CHECKSUM egy hash értéket, az úgynevezett ellenőrző összeget számítja ki az argumentumlistáján. Ezt a hash értéket használd hash indexek építéséhez. Hash index akkor alakul ki, ha a CHECKSUM függvénynek oszlopargumentumai vannak, és indexet építenek fel a számított CHECKSUM értékre. Ez használható egyenlőségi keresésekhez az oszlopok felett.
A CHECKSUM függvény teljesíti a hash függvény tulajdonságait: CHECKSUM bármely két kifejezéslistára alkalmazva ugyanazt az értéket adja, ha a két lista megfelelő elemei azonos adattípusúak, és ha ezek az elemek egyenértékűek az egyenlő (=) operátorral való összehasonlításkor. A meghatározott nullértékeket úgy definiáljuk, hogy egyenlőként hasonlítsák össze függvény CHECKSUM szempontjából. Ha legalább az egyik érték megváltozik az kifejezéslistában, a lista ellenőrző összege valószínűleg változni fog. Ez azonban nem garantált.
Ezért annak felismeréséhez, hogy változtak-e az érték, csak akkor javasoljuk, ha CHECKSUM az alkalmazása elviseli az alkalmi kihagyott változtatást. Ellenkező esetben fontold meg a használatot HASHBYTES . Egy meghatározott MD5 hash algoritmus esetén annak valószínűsége, hogy HASHBYTES két különböző bemenet esetén ugyanazt az eredményt adja vissza, sokkal alacsonyabb, mint CHECKSUM.
CHECKSUM figyelmen kívül hagyja az NCHAR és Nvarchar dash karaktert (N'-' vagy nchar(45)). Ezért garantált a hash ütközés bármely két string esetén, ahol az egyetlen különbség a szipátcsa. Másképp Select checksum(nchar(45)); fogalmazva, Select checksum(N'-'); mindkettő értéket 0ad, így nincs hatásuk a láncsorban lévő további karakterek hash-ére vagy a kontrollösszeg-lista további adataira.
Gyakorlati problémák:
- Az ellenőrző összeg figyelmen kívül hagyja a negatív aláírást a numerikus stringben
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
- Az ellenőrzőösszeg-összehasonlítás nem tudja felismerni, hogy a kód a tárolt proc definícióban kommentelt lett
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 A NCHAR és Nvarchar húrok mögötti tereket díszítik. A hatás ugyanaz, mint a figyelmen kívül hagyott csíkok problémája.
Az expresszíció sorrendje befolyásolja a kiszámított CHECKSUM értéket. Az oszlopok sorrendje CHECKSUM(*) a táblázatban vagy nézet definíciójában meghatározott oszlopok sorrendje. Ez magában foglalja a számított oszlopokat is.
Az CHECKSUM érték az összeállítástól függ. Ugyanaz az érték, amelyet más összeállítással tárolnak, más CHECKSUM értéket ad vissza.
CHECKSUM () nem garantálja az egyedi eredményeket.
Példák
Ezek a példák bemutatják a hash CHECKSUM indexek építésének használatát.
A hash index felépítéséhez az első példa egy kiszámított ellenőrző oszlopot ad hozzá ahhoz a táblához, amelyet indexelni szeretnénk. Ezután indexet épít az ellenekösszeg oszlopon.
-- 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
Ez a példa bemutatja a checksum index hash indexként való használatát. Ez segíthet javítani az indexelési sebességet, ha az indexelendő oszlop hosszú karakteroszlop. Az ellenőrző összeg index használható egyenlőségi keresésekhez.
/*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
Az indexkészítés a kiszámított oszlopon megvalósítja az ellenőrző összesítő oszlopot, és az érték változása ProductName átterjed az ellenőrző oszlopba. Alternatívaként közvetlenül az oszlopon építhetünk indexet. Azonban hosszú kulcsértékek esetén egy sima index valószínűleg nem fog olyan jól teljesíteni, mint egy kontrollösszeg-index.
Lásd még
CHECKSUM_AGG (Transact-SQL)
HASHBYTES (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)