返回對表中的行或表達(dá)式列表計算的二進(jìn)制校驗值。BINARY_CHECKSUM 可用于檢測表中行的更改。
BINARY_CHECKSUM ( * | expression [ ,...n ] )
*
指定對表中的所有列進(jìn)行計算。BINARY_CHECKSUM 在計算中忽略具有不可比數(shù)據(jù)類型的列。不可比數(shù)據(jù)類型是 text、ntext、image、cursor 以及基本類型為前 4 個數(shù)據(jù)類型之一的 sql_variant。
expression
任何類型的表達(dá)式。BINARY_CHECKSUM 在計算中忽略具有不可比數(shù)據(jù)類型的表達(dá)式。
在表中任一行上計算的 BINARY_CHECKSUM(*) 返回相同的值,只要隨后沒有修改行。BINARY_CHECKSUM(*) 將為大多數(shù)(但不是全部)行更改返回不同的值,并可用于檢測大多數(shù)行修改。
BINARY_CHECKSUM 可應(yīng)用在表達(dá)式列表上,并為給定的列表返回相同的值。如果任意兩個表達(dá)式列表的對應(yīng)元素具有相同的類型和字節(jié)表示法,則在這兩個列表上應(yīng)用的 BINARY_CHECKSUM 將返回相同的值。對于此定義,特定類型的 NULL 值被認(rèn)為具有相同的字節(jié)表示法。
BINARY_CHECKSUM 和 CHECKSUM 具有相似的功能:它們可用于計算表達(dá)式列表上的校驗值,且表達(dá)式的順序?qū)⒂绊懡Y(jié)果值。BINARY_CHECKSUM(*) 使用的列順序是表或視圖定義中指定的列順序,包括計算列。
CHECKSUM 和 BINARY_CHECKSUM 僅為字符串?dāng)?shù)據(jù)類型返回不同的值,這類字符串的區(qū)域設(shè)置可能導(dǎo)致具有不同表示法的字符串進(jìn)行等值比較。字符串?dāng)?shù)據(jù)類型為 char、varchar、nchar、nvarchar 或 sql_variant(如果 sql_variant 的基本類型是字符串?dāng)?shù)據(jù)類型)。例如,字符串"McCavity"和"Mccavity"的 BINARY_CHECKSUM 值不同。反之,在不區(qū)分大小寫的服務(wù)器中,上述字符串的 CHECKSUM 返回相同的校驗值。CHECKSUM 值不應(yīng)與 BINARY_CHECKSUM 值進(jìn)行比較。
本例使用 BINARY_CHECKSUM 來檢測 Northwind 數(shù)據(jù)庫的 Products 表中一行的改變。
/*Get the checksum value before the values in the specific rows (#13-15) are changed.*/
USE Northwind
GO
CREATE TABLE TableBC (ProductID int, bchecksum int)
INSERT INTO TableBC
SELECT ProductID, BINARY_CHECKSUM(*)
FROM Products
/*TableBC contains a column of 77 checksum values corresponding to each row in the Products table.*/
--A large company bought products 13-15.
--The new company modified the products names and unit prices.
--Change the values of ProductsName and UnitPrice for rows 13, 14, and 15 of the Products table.*/
UPDATE Products
SET ProductName='Oishi Konbu', UnitPrice=5
WHERE ProductName='Konbu'
UPDATE Products
SET ProductName='Oishi Tofu', UnitPrice=20
WHERE ProductName='Tofu'
UPDATE Products
SET ProductName='Oishi Genen Shouyu', UnitPrice=12
WHERE ProductName='Genen Shouyu'
--Determine the rows that have changed.
SELECT ProductID
FROM TableBC
WHERE EXISTS (
SELECT ProductID
FROM Products
WHERE Products.ProductID = TableBC.ProductID
AND BINARY_CHECKSUM(*) <> TableBC.bchecksum)
下面是結(jié)果集:
ProductID相關(guān)文章
13
14
15