【问题标题】:SQL Server create checksum out of multiple rowsSQL Server 从多行创建校验和
【发布时间】:2015-11-17 18:07:29
【问题描述】:

我有一张包含产品交付信息的表格。我得到附加到此表的每日文件。但是,如果导入出现问题,我不能简单地重新导入同一个文件,因为它可能已经导入了一些数据,然后我就会有重复。

我正在考虑添加校验和/哈希行,以便我可以比较这些行并省略已经存在的内容。

表格如下(简化):

  • id(标识行,整数)
  • ordernr(整数)
  • 项目(varchar)
  • itemcount(整数)
  • 交货日期(日期)
  • ...还有一些东西

我想添加一行“校验和”,它是 ordernr、item、itemcount 和 deliverydate 行的组合哈希。由于表相当大(1m+ 行),我什至更喜欢 right(hash,8),所以 varchar(8) 对于校验和行就足够了。

到目前为止,我已经到了这里:

SELECT o1.rdid, HASHBYTES('md5', (
    SELECT ordernr, item, deliverydate, itemcount
    FROM shop_tt_deliveries_uk o2
    WHERE o2.rdid = o1.rdid FOR XML RAW))
FROM shop_tt_deliveries_uk o1

生成哈希的方法如下:

rdid    (No column name)
98851   0xA819EEB0B7463DCB11AE8170879F867C
98852   0x73DB5FE112707BB3D9564DE063882F30
98853   0x3F81DBCED4D6B200CD605BC774FD5EB4
98854   0xF388A700995F8B589AE31CFE0AEF9568

但是已经添加了 right() 会导致奇怪的东西(我期望第一行是 '879F867C'):

rdid    (No column name)
98851   ®p‡Ÿ†|
98852   ÙVMàcˆ/0
98853   Í`[Çtý^´
98854   šãþ

并且更新表格根本不起作用:

UPDATE shop_tt_deliveries_uk d
SET checksum = HASHBYTES('md5', (
    SELECT ordernr, item, deliverydate, itemcount
    FROM shop_tt_deliveries_uk o2
    WHERE o2.rdid = o1.rdid ))
WHERE checksum IS NULL

有什么见解吗?

【问题讨论】:

    标签: sql-server hash checksum


    【解决方案1】:
     declare @source varbinary(max), @id int
     declare chk cursor for SELECT o1.rdid, HASHBYTES('md5', (SELECT ordernr, item, deliverydate, itemcount FROM shop_tt_deliveries_uk o2 WHERE o2.rdid = o1.rdid FOR XML RAW)) FROM shop_tt_deliveries_uk o1
    open chk
    fetch next from chk into @id, @source
    while (@@fetch_status = 0)
    begin
      select @source = right(cast('' as xml).value('xs:hexBinary(sql:variable("@source"))', 'varchar(max)'),8)
      update shop_tt_deliveries_uk d SET checksum = @source WHERE checksum IS NULL //put your more conditions
      fetch next from chk into @id, @source
    end
    

    【讨论】:

    • 哇,真快。运行此程序时我只遇到一个错误:Msg 257, Level 16, State 3, Line 7 不允许从数据类型 varchar(max) 到 varbinary(max) 的隐式转换。使用 CONVERT 函数运行此查询。我正在运行 sql server 2012
    • 好的,在第一行将 varbinary 更改为 varchar。它现在正在运行。等着看会发生什么...可能需要一段时间才能处理所有现有的行。
    • hmmm,做一个无限循环(我添加了一些条件来限制计数):(414 行受影响)(414 行受影响)(414 行受影响)但数据库中没有任何更新...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2017-04-16
    • 2021-10-01
    • 2015-09-10
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多