Sql-Server

使用校驗和與 Binary_checksum 驗證數據

  • November 2, 2018

基於這篇文章,我能夠通過添加索引來解決性能問題,並認為我完成了我的項目,直到我遇到校驗和問題……然後我做了研究(應該在我開始項目之前完成)和發現校驗和和二進制校驗和在系統關鍵環境中不可靠

我正在尋找一種可靠的方法來計算商店中一張桌子的數據,然後將其與總部的同一張桌子進行比較。

正如上面提到的文章中所解釋的,數據文件在發生時從多個商店(交易)傳輸到總部。對於每家商店,有問題的桌子都很大。在總部,一張表包含來自所有商店的相同資訊,這使得它變得巨大。數據通過文件傳輸,因為 HO 和商店之間沒有任何直接連接。理想情況下,如果我可以逐行傳輸商店中的所有數據並將其與總部的表格進行比較,那就太好了,但這是不可想像的,因為它太大了。

我嘗試HASHBYTES通過將列轉換為字元串來使用它,但發現它在 SQL Server 2014 之前有 8000 個字元的限制。我們的系統必須支持從 2008 到今天的任何版本的 SQL Server。

我正在嘗試找到一種可靠的方法來獲取某種類型的聚合校驗和值,該值可以在每個商店及其 head_office 表之間逐表進行比較。

**更新:**我嘗試使用 Hashbyte,但在我的情況下它不起作用,因為由於每個商店和總部之間的數據量,我沒有逐行比較。範例:如果一家商店有 100 000 行的表,則擁有 10 家商店資訊的總部將在同一張表中包含 1 000 000 行…我無法將商店中的所有行發送到總部只是為了比較並確保所有數據都已成功傳輸。所以我的思維方式是按日期匯總商店的資訊,並將其與總部同一家商店的相同匯總進行比較,如果發現不匹配,我會觸發一個流程以從商店請求資訊到總部的具體日期。

我很高興找到校驗和的 Checksum_agg,它就是這樣做的……但是在閱讀和測試不同的場景(例如校驗和(100.00)給出與校驗和(10.00)相同的結果之後,它扼殺了我的整個邏輯。

還有其他想法嗎?任何人?

幫助我解決這個難題的解決方案是使用帶有 SHA2_256 的雜湊字節,然後將其轉換為 bigint,然後轉換為浮點數,最後進行總結。

請注意,從 varbinary 到 bigint 的轉換可能很危險,但在我的情況下這是可以接受的。不支持直接從 varbinary 到 float 的轉換……並且由於溢出,用 bigint 總結許多記錄還不夠……因此將 bigint 轉換為 float 的原因。

引用自:https://dba.stackexchange.com/questions/221106