2012-06-08 2 views
2

Почему, когда вы запускаете это, вы получаете 2.00 как ответ?Почему литье удерживается внутри фраз?

declare @temp int = 2 
select CASE WHEN @temp = 1 THEN cast(@temp as decimal(5, 2)) 
     WHEN @temp = 2 THEN @temp 
     ELSE NULL 
    END 

Но если запустить это, вы получите как ответ при выборе только @ temp2

declare @temp2 int = 2 
select CAST(@temp2 as decimal(5,2)) 
select @temp2 

мост правильно:

Возвращает максимальный тип приоритета из множества типы в result_expressions и необязательное else_result_expression. (Source)

Data Type Precedence

ответ

2

Я считаю, что возвращаемое значение должно быть таким же типом данных для каждого возможного выхода из сазе. Он рассматривает возможные выходы и пытается перевести их всех в один и тот же тип.

Первое возможное возвращаемое значение имеет тип decimal(5, 2), а второй тип int. Он выбирает тип данных с самым высоким подтверждением, которое может удерживать оба значения, и автоматически выводит все выходы на это для вас.

Ваш второй скрипт ведет себя как ожидалось. Вы фактически получаете два значения выхода:

  • 2.00 - который является результатом броска во второй строке
  • 2 - что значение @ Temp2 - который является INT, вы назначили его на первый line
+0

Ах, вы правы! – Ryan

+1

Не совсем, когда вы меняете операторы 2 'WHEN', он должен« видеть »первое возвращаемое значение, которое остается int. Таким образом, это больше похоже на то, что оно передается в тип данных, который может содержать обе возможности. Нет? – fancyPants

+0

@tombom Да, я верю, что так оно и работает. Я думаю, вы могли бы получить SQL_VARIANT, получая выход, если бы там было достаточно сумасшествия. Я добавлю ваше лучшее объяснение к моему ответу. – Bridge

Смежные вопросы