IIF
возвращает тип данных с наивысшим приоритетом из типов в true_value и false_value.В этом случае это @Hash1
, что составляет varchar(255)
, поэтому ваш результат будет приведен к varchar(255)
.См. Ниже.
DECLARE @Hash varchar(255) = 'testvalue'
SELECT cast(HASHBYTES('SHA1',@Hash) as varchar(255))
Аналогично, CASE
работает так же.Однако, если вы не добавите ELSE
или другой WHEN
, который будет конфликтовать с типом данных, это будет работать.Это потому, что подразумевается ELSE NULL
.т. е.
SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) END
Однако, если вы добавите еще одну проверку, приоритет вступит в силу, и он будет преобразован.
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