Ошибка преобразования при преобразовании значения nvarchar в тип данных int - Сообщение об ошибке - PullRequest
0 голосов
/ 14 марта 2019

Мой запрос

Select * from MyTable

Таблица состоит из 300 тыс. Строк.Он работает для 200k + строк, и эта ошибка появляется.

enter image description here

Как обработать это, чтобы получить полные данные?

Есть ли в MyTable какие-либо вычисляемые столбцы?

Таблица состоит из вычисляемого столбца с именем IsExceeds, которое приводится ниже для справки.

enter image description here

Это вычисленная формула столбца:

(CONVERT([int],[Pro_PCT])-CONVERT([int],replace([Max_Off],'%','')))

Определения полей:

[Pro_PCT] [nvarchar](50) NULL,
[Max_Off] [nvarchar](50) NULL,
[IsExceeds]  AS (CONVERT([int],[Pro_PCT])-CONVERT([int],replace([Max_Off],'%','')))

Ответы [ 4 ]

1 голос
/ 14 марта 2019

Почему вы храните суммы в виде строк? Это фундаментальная проблема.

Итак, я бы предложил исправить ваши данные. Примерно так:

update mytable
    set max_off = replace(max_off, '%');

alter table mytable alter pro_pct numeric(10, 4);
alter table mytable alter max_off numeric(10, 4);

(без выборочных данных или примера данных, которые я просто предполагаю для разумного типа.)

Затем вы можете определить IsExceeds как:

(Pro_PCT - Max_Off)

Вуаля! Нет проблем.

1 голос
/ 14 марта 2019

Пожалуйста, конвертируйте в float, затем конвертируйте в int.

declare @n nvarchar(20)
set @n='11.11'

if (isnumeric(@n)=0)
 SELECT 0
   else 
      SELECT CAST(CONVERT(float, @n) as int) AS n
0 голосов
/ 14 марта 2019

Проверьте неверные данные с помощью

select  * from MyTable where isnumeric(  Max_Off ) = 0 
0 голосов
/ 14 марта 2019

На основе формулы - Pro_PCT или Max_Off содержит значение 11.11 (ну, с дополнительным % для Max_Off. Возможно, они также содержат другие значения, которые нельзя преобразовать в int.

Вот что вы можете сделать, чтобы найти все строки, которые вызывают эту проблему:

Select * 
from MyTable
where try_cast(Pro_PCT as int) is null
or try_cast(replace([Max_Off],'%','') as int) is null

После того, как вы их нашли, вы можете либо исправить значения, либо изменитьвычисление вычисляемого столбца для использования try_cast или try_convert вместо convert.

...