Ошибка арифметического переполнения при преобразовании nvarchar в числовую ошибку типа данных с помощью max

  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

Если я не поставил КОГДА x.Display = 1912.995 ТО 1913, то я получаю следующую ошибку: Ошибка преобразования при преобразовании значения nvarchar '1912.995' в тип данных int.

x.Display - это nvarchar. К сожалению, я не контролирую дизайн колонны.

Ошибка: преобразование завершилось неудачно при преобразовании значения nvarchar '1912.995' в тип данных int.

Это потому, что вы храните числа и строки в одном столбце. Вам нужно будет изменить это на ... когда x.Display = '1912.995', тогда ... И вам действительно стоит подумать о переделке здесь.

Sean Lange 13.09.2018 21:37

Есть нет SQL Server 2010 г. - у нас есть 2000, 2005, 2008, 2008 R2, 2012, 2014, 2016 и 2017 - выбирайте ...

marc_s 20.09.2018 06:54
0
2
136
2

Ответы 2

Вам действительно следует избегать хранения смешанных типов данных в одном столбце.

Тем не менее, я предполагаю, что другие ваши значения для 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

Тип выражения CASE - это тип значения с наивысшим приоритетом. В этом случае значениями являются 0, 0, 0, 1983 и Display. Это типы int, int, int, int и nvarchar. Поскольку 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

Вам это помогло?

David Dubois 01.10.2018 23:29

Другие вопросы по теме