Megosztás a következőn keresztül:


ELLENŐRZŐ (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsSQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-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:

  1. 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');
  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)