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.
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 CHECKSUM
dengan .
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:
- Checksum mengabaikan tanda tangan negatif dalam string numerik
SELECT CHECKSUM(N'1'), CHECKSUM(N'-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)