转换为Integer不能正常工作?

时间:2011-12-17 06:58:17

标签: sql sql-server sql-server-2008

执行这些并检查结果为什么会这样?

declare @a decimal(8,3) =235.363
declare @b int          =1

select case @b
            when 1 then cast(@a as int)
            when 2 then CAST(@a as decimal(8,3))
end

Result  : 235.000

declare @a decimal(8,3) =235.363
declare @b int          =1

select case @b
            when 1 then cast(@a as int)
            --when 2 then CAST(@a as decimal(8,3))
end

Result  : 235

declare @a decimal(8,3) =235.363
declare @b int          =1

select case @b
            when 1 then cast(@a as tinyint)
            when 2 then CAST(@a as float)
end

Result : 235

4 个答案:

答案 0 :(得分:2)

你看到的不是你得到的。

对于列类型,SQL Server选择正确的,更宽的类型(float超过tinyintdecimal超过int。您可以通过执行select into而不是仅选择来验证。

只是显示规则不同 当所选列类型为float时,如果没有小数部分,则看不到尾随.000
对于设置了明确位置的decimal,例如decimal(8,3),即使没有小数部分,您也会看到尾随.000。如果您删除说明符并仅将decimal作为列类型,则.000将消失。

所有这些都不会影响实际的列类型,它总是最宽的类型。

答案 1 :(得分:2)

the BOL entry for CASE

中记录了此行为
  

返回类型

     

从中输入类型集中的最高优先级类型   result_expressions和可选的else_result_expression。更多   信息,请参阅Data Type Precedence (Transact-SQL)

如果您点击指向数据类型优先级的链接,您会看到float的优先级高于decimal,而tinyint的优先级高于{{1}},因此会出现此行为。

答案 2 :(得分:0)

可能施法操作会将所有选项投射到更大的类型。

来自MSDN:

  

input_expression和每个when_expression的数据类型必须是   相同或必须是隐式转换。

http://msdn.microsoft.com/en-us/library/ms181765.aspx

答案 3 :(得分:0)

施放到整数无效。

您的陈述不正确!

CASE语句中,您只能返回一种类型的数据,因此根据您的语句,您可以返回INTdecimal(8,3),因为您的案例陈述有{{1}所以这里decimal(8,3)数据被隐式转换为十进制! 请参见下面的示例:,请始终尝试在INT语句中使用相同的返回类型,以获得正确的预期结果,谢谢。

1

CASE

2

select case @b
    when 1 then CAST(@a as int) -- return type INT
when 2 then CAST(@a as int) -- return type INT
end