Aracılığıyla paylaş


CHECKSUM (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric'te SQL analitiği uç noktasıMicrosoft Fabric'te DepoMicrosoft Fabric'te SQL veritabanı

Fonksiyon, CHECKSUM bir tablo satırı veya bir ifade listesi üzerinden hesaplanan kontrol toplamı değerini döndürür. Hash indeksleri oluşturmak için kullanılır CHECKSUM .

Transact-SQL söz dizimi kuralları

Sözdizimi

CHECKSUM ( * | expression [ ,...n ] )  

Uyarı

Bu söz dizimi, Azure Synapse Analytics'teki sunucusuz SQL havuzu tarafından desteklenmez.

Arguments

*
Bu argüman, kontrol toplamı hesaplamasının tüm tablo sütunlarını kapsadığını belirtir. CHECKSUM herhangi bir sütunun karşılaştırılamayan veri tipine sahipse hata döndürür. Karşılaştırılmayan veri türleri şunlardır:

  • imleç
  • image
  • ntext
  • text
  • XML

Karşılaştırılmayan bir diğer veri türü, önceki veri tiplerinden herhangi birinin temel tipi olarak kullanıldığı sql_variant .

expression
Karşılaştırılmayan bir veri türü hariç herhangi bir türden bir ifade .

Dönüş türleri

int

Açıklamalar

CHECKSUM argüman listesi üzerinde kontrol toplamı olarak adlandırılan bir hash değerini hesaplar. Bu hash değerini hash indeksleri oluşturmak için kullanın. Fonksiyonun CHECKSUM sütun argümanları varsa ve hesaplanan CHECKSUM değer üzerinde bir indeks oluşturulursa bir hash index oluşur. Bu, sütunlar üzerinde eşitlik aramaları için kullanılabilir.

Fonksiyon, CHECKSUM hash fonksiyon özelliklerini sağlar: CHECKSUM herhangi iki ifade listesi üzerine uygulandığında, iki listenin ilgili elemanları aynı veri tipine sahipse ve bu karşılık gelen elemanlar eşit (=) operatörü kullanılarak karşılaştırıldığında eşit olduğunda aynı değeri verir. Belirli bir türdeki null değerler, fonksiyon amaçları için eşit CHECKSUM olarak karşılaştırmak üzere tanımlanır. İfade listesindeki değerlerden en az biri değişirse, liste kontrol toplamı muhtemelen değişecektir. Ancak bu garanti değildir. Bu nedenle, değerlerin değişip değişmediğini tespit etmek için, uygulamanız ara sıra kaçırılan değişikliği tolere edebiliyorsa kullanılmasını CHECKSUM öneririz. Aksi takdirde, bunun yerine kullanmayı HASHBYTES düşünün. Belirli bir MD5 hash algoritmasında, iki farklı girdi HASHBYTESiçin aynı sonucu verme olasılığıCHECKSUM, .

CHECKSUM NCHAR ve Nvarchar dash karakterini (N'-' veya nchar(45)). Bu nedenle, tek farkları kese olan herhangi iki dizi için hash çarpışması garanti edilir. Başka Select checksum(nchar(45)); bir deyişle, Select checksum(N'-'); her ikisi de değer döndürür 0, böylece dizedeki ek karakterlerin veya kontrol toplamı listesindeki ek verilerin hash'ını etkilemezler. Pratik sorunlar:

  1. Kontrol toplamı, sayısal dizide negatif imzayı görmezden gelir
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Bir kontrol toplamı karşılaştırması, saklanan işlem tanımında yorumlandığını tespit edemez
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 NCHAR ve Nvarchar tellerinden alınan boşlukları kesimler. Etki, görmezden gelinmiş tire sorunuyla aynı.

İfade sırası, hesaplanan CHECKSUM değeri etkiler. Kullanılan CHECKSUM(*) sütunların sırası, tablo veya görünüm tanımında belirtilen sütunların sırasıdır. Bu, hesaplanan sütunları da kapsar.

Değer CHECKSUM derleme ile bağlıdır. Aynı değer farklı bir derleme ile kaydedilir, farklı CHECKSUM bir değer döndürür.

CHECKSUM () benzersiz sonuçları garanti etmez.

Örnekler

Bu örnekler, hash indeksleri oluşturmak için kullanımını CHECKSUM göstermektedir.

Hash indeksini oluşturmak için, ilk örnek indekslemek istediğimiz tabloya hesaplanmış bir kontrol toplamı sütunu ekler. Daha sonra kontrol toplamı sütununda bir indeks oluşturur.

-- 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  

Bu örnek, bir kontrol toplamı indeksinin hash index olarak kullanımını gösterir. Bu, indeksleme sütunu uzun bir karakter sütunu olduğunda indeksleme hızını artırmaya yardımcı olabilir. Kontrol toplamı indeksi eşitlik aramaları için kullanılabilir.

/*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  

Hesaplanan sütunda indeks oluşturulması, kontrol toplamı sütununu gerçekleştirir ve değerdeki ProductName herhangi bir değişiklik kontrol toplamı sütununa yanılır. Alternatif olarak, indekslemek istediğimiz sütunun üzerine doğrudan bir indeks oluşturabiliriz. Ancak, uzun anahtar değerler için, normal bir endeks muhtemelen kontrol toplamı endeksi kadar iyi performans göstermez.

Ayrıca bakınız

CHECKSUM_AGG (Transact-SQL)
HASHBYTES (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)