BINARY_CHECKSUM(*) 會根據資料列所有可比較欄位計算二進位檢查碼。同一資料列在 UPDATE 後,檢查碼會改變,藉此快速判斷哪些列被修改。
BINARY_CHECKSUM ( * | expression [ ,...n ] )
忽略不可比較類型:text、ntext、image、cursor、sql_variant。
-- 1. 建立測試表並寫入初始資料
CREATE TABLE CheckRowIsUpdate (id INT, name VARCHAR(20));
INSERT INTO CheckRowIsUpdate VALUES (1,'aa'),(2,'bb'),(3,'cc'),(4,'dd');
-- 2. 將初始檢查碼存入暫存表
SELECT *, BINARY_CHECKSUM(*) AS BID INTO #CheckRowIsUpdate FROM CheckRowIsUpdate;
-- 3. 修改資料
UPDATE CheckRowIsUpdate SET name = 'checkupdate' WHERE id = 4;
-- 4. 比對找出變更列
SELECT * FROM #CheckRowIsUpdate A
WHERE EXISTS (
SELECT 1 FROM CheckRowIsUpdate B
WHERE A.id = B.id AND BINARY_CHECKSUM(*) <> A.BID
);
-- 結果:僅回傳 id=4 的列
INSERTED 與 DELETED 的檢查碼,記錄實際變更欄位。CHECKSUM_AGG 或 HASHBYTES('MD5', ...)。