如何在MS SQL中把一个十六进制编码的字符串转换成一个整数?

1 人不认可

我想在 MS SQL Server 中把HASHBYTES (SHA2_256)函数返回的一段哈希字符串转换为一个整数。

这个查询返回 '6BDA'

SELECT (SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4)) as tmp

但是当我试图将其转换为一个int时,会导致一个错误。

--Conversion failed when converting the varchar value '6BDA' to data type int.
SELECT (CONVERT(int, SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4))) as tmp

如果我尝试将子串转换为varbinary,然后再转换为int,结果与27610不同。

--Returns 910312513
SELECT (CONVERT(int, CONVERT(varbinary, SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4)))) as tmp

Snowflake中,我可以用一个to_number 函数轻松地进行转换。

下面的查询将'6BDA' 转换为27610。我怎样才能用SQL Server实现同样的结果?

SELECT to_number(substr(sha2(TO_VARCHAR(ABS(12.5)), 256), 61), 'xxxx')
    
1 个评论
我不确定你的实际使用情况,但如果你需要一个整数而不是一个字符串,你可以使用 CAST(CAST(SUBSTRING(HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))),31,2) AS varbinary(4)) AS int)
sql
sql-server
hash
cryptography
snowflake-cloud-data-platform
samba
samba
发布于 2020-08-02
1 个回答
Lars Skaug
Lars Skaug
发布于 2020-08-02
0 人赞同
SELECT CAST( CONVERT(VARBINARY,'0x'+RIGHT('00000000'+REPLACE(tmp,'x',''),8),1) AS INT)
from table1

我用下面的DDL测试了它。

create table table1(tmp varchar(64));