Sql 为什么在使用case语句时会更改输出?

Sql 为什么在使用case语句时会更改输出?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,有人能解释结果吗 DECLARE @dec AS VARCHAR(5) SET @dec = 'Yes' DECLARE @val DECIMAL(15, 2); SET @val = - 34152542256.86; SELECT @val as c1 ,CAST(@val AS BIGINT) as c2 SELECT @val as c1 ,CASE @dec WHEN 'Yes' THEN CAST(@val AS BI

有人能解释结果吗

DECLARE @dec AS VARCHAR(5)

SET @dec = 'Yes'

DECLARE @val DECIMAL(15, 2);

SET @val = - 34152542256.86;

SELECT @val as c1
    ,CAST(@val AS BIGINT) as c2

SELECT @val as c1
    ,CASE @dec
        WHEN 'Yes'
            THEN CAST(@val AS BIGINT)
        ELSE @val
        END as c2
结果:

第一个select语句的名称:

 c1                     c2
-34152542256.86         -34152542256
 c1                     c2
-34152542256.86         -34152542256.00
第二个select语句的名称:

 c1                     c2
-34152542256.86         -34152542256
 c1                     c2
-34152542256.86         -34152542256.00

在第一个select语句中,c2的结果只能是BIGINT。
在第二条语句中,结果可以是BIGINT或DECIMAL15,2,属于输入case语句的哪个分支。由于不能在一列中包含混合类型,sql server会自动将c2转换为十进制15,2

BIGINT是一个整数值,因此不允许缩放,请尝试使用十进制或数字。 不要放弃阅读


在CASE语句中有一个隐式转换。基本上,c2必须有一个数据类型,但SQL Server不知道它是DECIMAL15,2还是BIGINT,因为这两种类型都是通过CASE语句从各个分支返回的。数据类型优先规则开始生效,c2最终被转换为小数15,2。

作为一种尝试,我认为这可能在这种情况下起作用,请尝试以下sql\u变体数据类型:

DECLARE @val sql_variant;

CASE必须返回一个能够存储不同操作数的数据类型:@val是一个小数15,2,结果也是如此。使用CASE语句我们无法正确更改数据类型?CASE无法根据其检查条件返回两个不同的数据类型。它必须返回单个数据类型。因此存在一种隐式转换。看看这个。选择CASE WHEN 1=1,然后选择123.432 ELSE GETDATE END。这将始终返回一个日期时间。当然,您可以在CASE或CastCase中显式使用CAST。那么,我如何有条件地更改数据类型?我想有条件地更改数据类型。可能吗?在同一列中?真是罪过。。。如果需要,可以查看sqlvariant数据类型,但我不建议使用动态数据类型-糟糕的编程风格