当在CASE WHEN/IIF中使用时,SQL HASHBYTES函数返回奇怪的输出

Imp*_*ert 2 sql sql-server stored-procedures hashbytes

我编写了一个存储过程来散列某个列的值.我需要在CASE WHEN或IIF语句中使用此HASHBYTES函数,如下所示:

DECLARE @Hash varchar(255) = 'testvalue'
SELECT    IIF(1=1, HASHBYTES('SHA1',@Hash), @Hash)
SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) END  AS Hashcolumn
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么我从上面的查询得到不同的输出?似乎每当我在CASE WHEN/IIF语句中添加一个ELSE时,它都会返回一串奇怪的字符(ü<þ+OUL'RDOk{­\Ìø如上例所示).

谁能告诉我为什么会这样?我需要使用CASE WHEN或IIF.

多谢你们

scs*_*mon 5

IIF返回true_value和false_value中具有最高优先级的数据类型.在这种情况下,它@Hash1varchar(255)你的结果是如此投射到varchar(255).见下文.

DECLARE @Hash varchar(255) = 'testvalue'
SELECT cast(HASHBYTES('SHA1',@Hash) as varchar(255))
Run Code Online (Sandbox Code Playgroud)

同样,CASE工作方式相同.但是,如果您不添加与数据类型冲突的一个ELSE或另一个WHEN,它将起作用.这是因为ELSE NULL暗示了.即

SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) END
Run Code Online (Sandbox Code Playgroud)

但是,如果您添加另一个检查,则优先级将启动,并且将进行转换.

SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) WHEN 1=2 THEN @Hash END AS Hashcolumn 
SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) ELSE @Hash END AS Hashcolumn 
Run Code Online (Sandbox Code Playgroud)