SQL 服务器 - 功能中的 Hasbytes 给出与 select 中不同的结果

SQL Server - Hasbytes in function gives different result then in select

我创建了一个这样的函数:

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

关于为什么会导致这样的结果有什么想法吗?乍一看像是转换问题,但我没看出问题所在

你在那里做的不一样。 HASHBYTES returns a varbinary (Hashbytes (Transact-SQL) - Return Values) 因为你的函数是 returning a varchar。这些是不同的数据类型。因此,函数的最后一行实际上是:

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

varbinaryvarchar 表示将不相同。 return 一个 varbinary 在你的函数中,或者你的测试 SELECTCONVERTvarchar(40).

编辑:为了确认,解决方案是简单地更改函数和变量的 return 类型:

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