Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка коныертации данных. Как узнать где?!  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Ошибка такая
SSMS
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to float.


Картинка такая как на картинке.

Запрос вот такой.
select count(mi.sci_mi_value), 
       sum(cast(mi.sci_mi_value as float)) 
  from dbo.sci_metric_inputs mi 
 where Isnumeric(mi.sci_mi_value) = 1


Как найти ошибку?! Точнее строчку с ошибкой. Потому что функция преобразования всегда вылетает с ошибкой, а try except/catch где она вылетела сделать не вариант (потому что функция). Цикл мутить тоже как-то "не айс".

К сообщению приложен файл. Размер - 9Kb
23 май 12, 23:44    [12604911]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Подождать еще немного. В сообщении об ошибке об UQ vilation уже пишут ключ, может и тут когда будет.
23 май 12, 23:53    [12604939]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
RubinDm
Member

Откуда:
Сообщений: 461
о.. это известные грабли. Зубы граблей в том, что сервер может сначала посчитать select-выражение, т.е. сделать каст применительно КО ВСЕМ значениям в поле, не только к тем, которые похожи на числа, и только потом применить фильтры. Круто, да?! Но он сервер, ему все можно, особенно если порядок расчета выражений НЕ оговорен в документации явным образом. Я сам с этим как-то боролся, даже топик поднимал, и справился - можете среди моих топиков поискать, их не так много.
23 май 12, 23:55    [12604945]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
VFl
Member

Откуда:
Сообщений: 126
Попробуйте
sum(cast(replace(mi.sci_mi_value, ',', '.') as float)) 



Такая ошибка бывает, когда запятая в числе есть. cast понимает только точки, а Isnumeric и запятые.
23 май 12, 23:57    [12604951]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
RubinDm
о.. это известные грабли. Зубы граблей в том, что сервер может сначала посчитать select-выражение, т.е. сделать каст применительно КО ВСЕМ значениям в поле, не только к тем, которые похожи на числа, и только потом применить фильтры. Круто, да?! Но он сервер, ему все можно, особенно если порядок расчета выражений НЕ оговорен в документации явным образом. Я сам с этим как-то боролся, даже топик поднимал, и справился - можете среди моих топиков поискать, их не так много.


Нет,
(это конечно тоже)
но я уже в подзапросы запихивал эту проверку - не момогло

Сейчас тупо ищё "те самые значения".
23 май 12, 23:59    [12604961]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
VFl,

Да, вы правы, часто данных с запятой, но есть и другие.
24 май 12, 00:11    [12605005]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Блин, в курсоре за 11ть минут только 6мь значений нашло.
Я 7мь только по like '%,%' нашёл.
Жалко что я сделал таблицу
#tResult; а не ##tResult; (или вообще реальную табилцу без палева) или print/select.

Ненавижу курсоры!

пока так крутится
24 май 12, 00:20    [12605020]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
declare cur cursor for 
select --top 10 
       mi.sci_mi_value 
  from dbo.sci_metric_inputs mi 
 where Isnumeric(mi.sci_mi_value) = 1;

declare @curVal nvarchar(100);

open cur;

if object_id('tempdb..#tResult') is not null
begin
 drop table #tResult;
end;

create table #tResult (value nvarchar(100));

while 1 = 1
begin
 
 
 fetch next from cur into @curVal; 
 
 if @@FETCH_STATUS <> 0
 begin
  break;
 end;
 
 begin try
  set @curVal = cast(@curVal as float);
 end try
 BEGIN CATCH
  insert into #tResult values (@curVal);
 END CATCH 
 
end; 

deallocate cur;
close cur;

select *
  from #tResult;


Что может быть неправильным?!
Уже 40+ минут.

в курсоре "всего" 8739945 записей :)
но сервер ну ооочень крутой ).

Сеть рвать не хочу, завтра заново ждать не хочу, удалёнки что бы "оставить выполнятся" нету, джоб создать не могу.
24 май 12, 00:53    [12605087]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
VFl
Member

Откуда:
Сообщений: 126
вообще надо было сначала close cur; а потом deallocate cur;

а так у меня тоже отработало. Обычные ошибки в cast :

, вместо .

только -

только +

только ,

только .

IsNumeric('+') = 1
IsNumeric('-') = 1
IsNumeric('.') = 1
IsNumeric(',') = 1

Можно отловить в селекте
24 май 12, 01:53    [12605145]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка коныертации данных. Как узнать где?!  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Господа, ну что же вы поиском-то не пользуетесь???

4076052

Таким образом, вот они, ошибочные строки:
SELECT *
FROM dbo.sci_metric_inputs
WHERE ISNUMERIC(sci_mi_value)=0 OR sci_mi_value NOT LIKE '%[0-9]%' OR sci_mi_value LIKE '%[^-+.eE 0-9]%';
24 май 12, 19:05    [12610384]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить