Bagikan melalui


CHECKSUM (T-SQL)

Berlaku untuk: Titik akhir analitik SQL ServerAzure SQL Database Azure SQL Managed Instance Azure Synapse Analytics SQL di Microsoft Fabric Warehouse di Microsoft Fabric

Fungsi CHECKSUM mengembalikan nilai checksum yang dihitung di atas baris tabel, atau melalui daftar ekspresi. Gunakan CHECKSUM untuk membangun indeks hash.

Konvensi sintaks transact-SQL

Sintaksis

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

Catatan

Sintaks ini tidak didukung oleh kumpulan SQL tanpa server di Azure Synapse Analytics.

Argumen

*
Argumen ini menentukan bahwa komputasi checksum mencakup semua kolom tabel. CHECKSUM mengembalikan kesalahan jika ada kolom yang memiliki jenis data yang tidak dapat dibandingkan. Jenis data yang tidak dapat dikompresi meliputi:

  • Kursor
  • gambar
  • ntext
  • text
  • XML

Jenis data lain yang tidak dapat diperbandingkan adalah sql_variant dengan salah satu jenis data sebelumnya sebagai jenis dasarnya.

expression
Ekspresi jenis apa pun, kecuali jenis data yang tidak dapat dibandingkan.

Jenis yang dikembalikan

int

Keterangan

CHECKSUM menghitung nilai hash, yang disebut checksum, di atas daftar argumennya. Gunakan nilai hash ini untuk membangun indeks hash. Indeks hash akan menghasilkan jika CHECKSUM fungsi memiliki argumen kolom, dan indeks dibangun di atas nilai komputasi CHECKSUM . Ini dapat digunakan untuk pencarian kesetaraan di atas kolom.

Fungsi CHECKSUM ini memenuhi properti fungsi hash: CHECKSUM yang diterapkan di atas dua daftar ekspresi akan mengembalikan nilai yang sama, jika elemen yang sesuai dari dua daftar memiliki jenis data yang sama, dan jika elemen terkait tersebut memiliki kesetaraan jika dibandingkan menggunakan operator sama dengan (=). Nilai null dari jenis tertentu didefinisikan untuk dibandingkan sebagai sama untuk CHECKSUM tujuan fungsi. Jika setidaknya salah satu nilai dalam daftar ekspresi berubah, checksum daftar mungkin akan berubah. Namun, ini tidak dijamin. Oleh karena itu, untuk mendeteksi apakah nilai telah berubah, sebaiknya gunakan CHECKSUM hanya jika aplikasi Anda dapat mentolerir perubahan yang terlewat sesekali. Jika tidak, pertimbangkan untuk menggunakan HASHBYTES sebagai gantinya. Dengan algoritma hash MD5 tertentu, probabilitas yang HASHBYTES akan mengembalikan hasil yang sama, untuk dua input yang berbeda, jauh lebih rendah dibandingkan CHECKSUMdengan .

CHECKSUM mengabaikan karakter tanda hubung nchar dan nvarchar (N'-' atau nchar(45)). Oleh karena itu, tabrakan hash dijamin untuk dua string di mana satu-satunya perbedaan adalah tanda hubung. Letakkan cara lain, Select checksum(nchar(45)); dan Select checksum(N'-'); keduanya mengembalikan nilai 0, sehingga tidak berpengaruh pada hash karakter tambahan dalam string atau data tambahan apa pun dalam daftar checksum. Masalah praktis:

  1. Checksum mengabaikan tanda tangan negatif dalam string numerik
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  1. Perbandingan checksum tidak dapat mendeteksi bahwa kode dikomentari dalam definisi proc tersimpan
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 memangkas spasi berikutnya dari string nchar dan nvarchar. Efeknya sama dengan masalah tanda hubung yang diabaikan.

Urutan ekspresi memengaruhi nilai komputasi CHECKSUM . Urutan kolom yang digunakan untuk CHECKSUM(*) adalah urutan kolom yang ditentukan dalam tabel atau definisi tampilan. Ini termasuk kolom komputasi.

Nilai CHECKSUM tergantung pada kolajeksi. Nilai yang sama yang disimpan dengan kolatasi yang berbeda akan mengembalikan nilai yang berbeda CHECKSUM .

CHECKSUM () tidak menjamin hasil yang unik.

Contoh

Contoh-contoh ini menunjukkan penggunaan CHECKSUM untuk membangun indeks hash.

Untuk membangun indeks hash, contoh pertama menambahkan kolom checksum komputasi ke tabel yang ingin kita indeks. Kemudian membangun indeks pada kolom checksum.

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

Contoh ini menunjukkan penggunaan indeks checksum sebagai indeks hash. Ini dapat membantu meningkatkan kecepatan pengindeksan ketika kolom untuk diindeks adalah kolom karakter panjang. Indeks checksum dapat digunakan untuk pencarian kesetaraan.

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

Pembuatan indeks pada kolom komputasi mewujudkan kolom checksum, dan setiap perubahan pada ProductName nilai akan disebarluaskan ke kolom checksum. Atau, kita dapat membangun indeks langsung pada kolom yang ingin kita indeks. Namun, untuk nilai kunci yang panjang, indeks reguler mungkin tidak akan berkinerja serta indeks checksum.

Lihat juga

CHECKSUM_AGG (T-SQL)
HASHBYTE (Transact-SQL)
BINARY_CHECKSUM (T-SQL)