Как преобразовать строку в шестнадцатеричной кодировке в целое число в MS SQL? - PullRequest
0 голосов
/ 01 августа 2020

Я хочу преобразовать часть строки ha sh, возвращенную функцией HASHBYTES (SHA2_256), в целое число MS SQL Server .

Этот запрос возвращает '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 Сервером?

SELECT to_number(substr(sha2(TO_VARCHAR(ABS(12.5)), 256), 61), 'xxxx')

1 Ответ

1 голос
/ 01 августа 2020

Попробуйте это

SELECT CAST( CONVERT(VARBINARY,'0x'+RIGHT('00000000'+REPLACE(tmp,'x',''),8),1) AS INT)
from table1

Я тестировал его с помощью следующего DDL:

create table table1(tmp varchar(64));

insert into table1
SELECT SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4) 

Посмотрите, как это работает this Fiddle .

...