Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric
De CHECKSUM functie geeft de checksumwaarde terug die is berekend over een tabelrij of over een expressielijst. Gebruik CHECKSUM om hash-indexen te bouwen.
Transact-SQL syntaxis-conventies
Syntaxis
CHECKSUM ( * | expression [ ,...n ] )
Opmerking
Deze syntaxis wordt niet ondersteund door een serverloze SQL-pool in Azure Synapse Analytics.
Arguments
*
Dit argument specificeert dat de checksumberekening alle kolommen van de tabel dekt.
CHECKSUM geeft een foutmelding als een kolom een niet-vergelijkbaar datatype heeft. Niet-vergelijkbare datatypen zijn onder andere:
- cursor
- image
- ntext
- tekst
- XML
Een ander niet-vergelijkbaar datatype wordt sql_variant met elk van de voorgaande datatypes als basistype.
expressie
Een expressie van elk type, behalve een niet-vergelijkbaar datatype.
Retourtypen
int
Opmerkingen
CHECKSUM berekent een hashwaarde, de checksum genoemd, over zijn argumentlijst. Gebruik deze hashwaarde om hashindexen te bouwen. Er ontstaat een hashindex als de CHECKSUM functie kolomargumenten heeft, en er wordt een index opgebouwd over de berekende CHECKSUM waarde. Dit kan worden gebruikt voor gelijkheidszoekopdrachten over de kolommen.
De CHECKSUM functie voldoet aan de eigenschappen van de hashfunctie: CHECKSUM toegepast op twee willekeurige lijsten van expressies geeft dezelfde waarde terug, als de overeenkomstige elementen van de twee lijsten hetzelfde datatype hebben, en als die overeenkomstige elementen gelijkheid hebben bij vergelijking met de operator: gelijk (=). Nulwaarden van een gespecificeerd type worden gedefinieerd om als gelijk te vergelijken voor CHECKSUM functiedoeleinden. Als ten minste één van de waarden in de expressielijst verandert, zal de lijstcontrolesom waarschijnlijk veranderen. Dit is echter niet gegarandeerd.
Daarom raden we aan om te detecteren of waarden zijn veranderd, alleen te gebruiken CHECKSUM als uw applicatie een occasionele gemiste wijziging kan verdragen. Anders kun je overwegen om het in plaats daarvan te gebruiken HASHBYTES . Met een gespecificeerd MD5-hashalgoritme is de kans dat HASHBYTES hetzelfde resultaat wordt teruggegeven voor twee verschillende invoer, veel lager vergeleken met CHECKSUM.
CHECKSUM Negeert het Nchar- en Nvarchar-dashkarakter (N'-' of nchar(45)). Daarom is een hashbotsing gegarandeerd voor twee strings waarbij de enige verschillen streepjes zijn. Zet het anders uit, Select checksum(nchar(45)); en Select checksum(N'-'); beide geven een waarde van 0terug, zodat ze geen effect hebben op de hash van extra tekens in de string of extra gegevens in de checksumlijst.
Praktische problemen:
- Checksum negeert negatieve handtekening in numerieke string
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
- Een checksumvergelijking kan niet detecteren dat code is weggecommenteerd in de opgeslagen proc-definitie
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 Knipt de achterste ruimtes van Nchar- en Nvarchar-snaren. Het effect is hetzelfde als het probleem van genegeerde streepjes.
De expressievolgorde beïnvloedt de berekende CHECKSUM waarde. De volgorde van kolommen die voor CHECKSUM(*) gebruikt worden, is de volgorde van kolommen die in de tabel of weergave is gespecificeerd. Dit omvat berekende kolommen.
De CHECKSUM waarde hangt af van de collatie. Dezelfde waarde die met een andere collatie wordt opgeslagen, geeft een andere CHECKSUM waarde op.
CHECKSUM () garandeert geen unieke resultaten.
Voorbeelden
Deze voorbeelden tonen het gebruik van CHECKSUM om hashindexen te bouwen.
Om de hashindex te bouwen, voegt het eerste voorbeeld een kolom met berekende checksum toe aan de tabel die we willen indexeren. Vervolgens wordt er een index opgebouwd op de checksumkolom.
-- 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
Dit voorbeeld toont het gebruik van een checksumindex als hashindex. Dit kan de indexeringssnelheid verbeteren wanneer de kolom naar indexering een kolom met een lange tekenkolom is. De checksumindex kan worden gebruikt voor gelijkheidszoekopdrachten.
/*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
Het aanmaken van een index op de berekende kolom materialiseert de checksumkolom, en eventuele wijzigingen in de ProductName waarde worden doorgevoerd naar de checksumkolom. Alternatief kunnen we een index direct bouwen op de kolom die we willen indexeren. Voor lange sleutelwaarden zal een gewone index echter waarschijnlijk minder goed presteren als een checksumindex.
Zie ook
CHECKSUM_AGG (Transact-SQL)
HASHBYTES (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)