使用MAX将nvarchar转换为数据类型数值错误的算术溢出错误

时间:2018-09-13 19:20:32

标签: sql-server

  SELECT x.Key, x.ID,
  MAX(CAST(CASE WHEN x.Display IS NULL THEN 0
  WHEN x.Display = 'Class' THEN 0
 WHEN x.Display = 'pricing' THEN 0
 WHEN x.Display = 1912.995 THEN 1913
 ELSE x.Display END as float)) AS GLwritten
 FROM x
 inner join y on y.rk_pk = x.pk
 group by x.Key, x.ID

如果我没有输入WHEN x.Display = 1912.995 THEN 1913,那么我将收到以下错误:  将nvarchar值'1912.995'转换为数据类型int时,转换失败。

x.Display是nvarchar。 不幸的是,我无法控制专栏上的设计。

错误是将nvarchar值'1912.995'转换为数据类型int时转换失败。

2 个答案:

答案 0 :(得分:0)

您应该真正避免在同一列中存储混合数据类型。

也就是说,我假设您的x.Display的其他值可以转换为FLOAT。您需要在CASE语句的每个部分中使用相同的数据类型,然后CAST才能工作。

DECLARE @x TABLE (Display NVARCHAR(MAX));
INSERT @x (Display) VALUES ('Class');
INSERT @x (Display) VALUES ('pricing');
INSERT @x (Display) VALUES ('1912.995');
INSERT @x (Display) VALUES ('123.456');

SELECT
    MAX(
        CAST(
            CASE WHEN x.Display IS NULL THEN '0'
            WHEN x.Display = 'Class' THEN '0'
            WHEN x.Display = 'pricing' THEN '0'
            ELSE x.Display END
        AS FLOAT)
    ) AS GLwritten
FROM @x x

答案 1 :(得分:0)

CASE表达式的类型是优先级最高的值的类型。在这种情况下,值为0001983Display。这些类型为intintintintnvarchar。由于int的优先级高于nvarchar,因此CASE表达式的类型为int。因此,当您尝试将带小数点的值转换为int时,它将失败。

请注意,float的优先级高于int。因此,如果您可以将值之一设为float,则整个CASE表达式的值将为float

执行此操作的一种方法是将第一个0替换为cast(0 as float)CASE的值为float,并且可以进行字符串转换。

create table x ( Display nvarchar(20)     );

insert into x ( Display ) values
( NULL         ),
( 'Class'      ),
( 'pricing'    ),
( '1912.995'   ),
( '3.14159265' ),
( '2000'       )

  SELECT CASE WHEN x.Display IS NULL THEN 0
  WHEN x.Display = 'Class' THEN cast ( 0 as float ) -- <<<===
 WHEN x.Display = 'pricing' THEN 0
 WHEN x.Display = 1912.995 THEN 1913
 ELSE x.Display END AS GLwritten
 FROM x