SQL Server - Хасбайты в функции дают другой результат, чем в select - PullRequest
0 голосов
/ 15 ноября 2018

Я создал такую ​​функцию:

CREATE FUNCTION dbo.HashCheeseName (@CheeseName NVARCHAR(40)) 
RETURNS VARCHAR(40) 
AS BEGIN
 DECLARE @Salt VARCHAR(25)
 DECLARE @CheeseName NVARCHAR(40)
 DECLARE @output VARCHAR(40) 
 SET @Salt = '123abc11aa'

 SET @output = HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt)
 RETURN @output
END
;

Когда я просто бегу

SELECT HASHBYTES('SHA2_256', CAST('SwissCheese' as VARCHAR(40)) + @Salt)

Я получаю ожидаемый результат, как 0xF456D41144584064AC5456B7E3 ...

Однако, когда я запускаю функцию в запросе

SELECT dbo.HashCheeseName('SwissCheese')

Я получаю такой результат: h:Mó!yýŠù’p» ªu_aøP¾æhw

Любые идеи о том, почему это приведет к чему-то вроде этого? На первый взгляд это похоже на проблему конверсии, но я не вижу проблемы

1 Ответ

0 голосов
/ 15 ноября 2018

То, что вы делаете там, не то же самое. HASHBYTES возвращает varbinary ( Hashbytes (Transact-SQL) - Возвращаемые значения ), где ваша функция возвращает varchar. Это разные типы данных. В результате последняя строка вашей функции будет эффективной:

SET @output = CONVERT(varchar(40),HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt));

varchar представление varbinary не будет таким же. Либо верните varbinary в вашей функции, либо ваш тест SELECT с CONVERT в varchar(40).

Редактировать: Чтобы подтвердить, решение состоит в том, чтобы просто изменить тип возврата вашей функции и переменной:

CREATE FUNCTION dbo.HashCheeseName (@CheeseName NVARCHAR(40)) 
RETURNS varbinary(8000)
AS BEGIN
    DECLARE @Salt VARCHAR(25);
    DECLARE @CheeseName NVARCHAR(40);
    DECLARE @output varbinary(8000) ;
    SET @Salt = '123abc11aa';

    SET @output = HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt);
    RETURN @output;
END
...