【问题标题】:Hash calculation using T-SQL update statement to generate 32 bit length使用 T-SQL 更新语句进行哈希计算生成 32 位长度
【发布时间】:2019-04-05 14:24:49
【问题描述】:

如何更改此代码以使其在 SQL Server 中工作?这目前在 SQL Server 中不起作用。

该语句用于计算 Oracle 中的校验和。如何使其适应 SQL Server?

    UPDATE Work 
  set ETL_CHECKSUM =  HASHBYTES('MD5',concat(
    Branch, '|',
    Group, '|', 
    Number, '|', 
    Column, '|',
    dDate, '|', 
   Basis, '|',
    per, '|',
     Mult, '|', 
     nDate, '|', 
     Key, '|', 
    INSERT_TS))  

【问题讨论】:

  • 如何使 what 在 SQL Server 中工作?这不是 SQL。我假设某些数据库允许像dbms_obfuscation_toolkit.md5(input => UTL_RAW.cast_to_raw(...)) 这样的调用。最好解释一下你想做什么 - I want to hash a row's values
  • 在 SQL Server 中,您可以使用 HASHBYTES 函数对值进行加密散列。正如文档所解释的,在最新版本中仅支持 SHA2,因为早期的哈希算法是不安全的。旧算法仍然有效,但会发出警告
  • Shore,MD5 已过时且不安全。但它根本不会产生任何警告。您在哪里收到警告?
  • @Sebastian 在文档中Beginning with SQL Server 2016 (13.x), all algorithms other than SHA2_256, and SHA2_512 are deprecated. Older algorithms (not recommended) will continue working, but they will raise a deprecation event.
  • @user10260750 你想做什么?无法验证计算中包含自身的哈希,几乎保证不同于其原始值。下次您尝试计算它时,它会有所不同。这意味着它没用

标签: sql-server tsql ssis


【解决方案1】:

SQL Server 引入了HASHBYTES 函数。这适用于 varchar、nvarchar 和 varbinary 数据。

DECLARE @HashThis nvarchar(4000);  
SET @HashThis = CONVERT(nvarchar(4000),'dslfdkjLK85kldhnv$n000#knf');  
SELECT HASHBYTES('MD5', @HashThis);

在链接中查看其他可用的哈希算法。

【讨论】:

    【解决方案2】:

    SQL Server 有一个名为 HASHBYTES 的函数:

    DECLARE @hashThis nvarchar(max);
    SET @hashThis = CONCAT(Branch, Discou, ...);  
    SELECT HASHBYTES('MD5', @hashThis);  
    

    看看:https://docs.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-2017

    【讨论】:

    • 另外请记住,并非所有功能都适用于所有 SQL Server 版本。 HASHBYTES 自 SQL Server 2008 起可用。CONCAT 自 SQL Server 2012 起可用。使用 SQL Server 2017 时,您还可以使用 CONCAT_WS。
    • 我假设使用的系统是现代的。如果有人需要有关石器时代的信息,他必须说明。 ;)
    • 是的,我同意当 OP 未指定特定版本时,就像在这种情况下一样。尽管如此,它通常仍然很重要,因为许多组织通常不会对他们的服务器系统进行太多升级。关于 OP 在他的问题中发布的数据并不表示对 SQL Server 平台的全面体验这一事实,我似乎没有必要提到每个功能的此版本支持。 ;)
    • 您正在混合两种连接方式。在函数 CONCAT() 中,您不需要 '|'。
    • 我试过 SELECT HASHBYTES('MD5',concat('Branch', 'DiscountGroup', 'ItemNumber', 'PriceColumn', 'LastUpdatedDate', 'PMBasis', 'PMOper', 'PMMult' , 'DeletedOnDate', 'PriceMatrixKey', 'ODS_INSERT_TS')) 在我的 SQL2017 上导致 '0x9B82DD8D902F16D86DF7BC1EEDA16E5B' 。当您使用硬编码字符串执行此示例时会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2012-12-05
    相关资源
    最近更新 更多