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

Откуда:
Сообщений: 451
Добрый день. Получается у меня ошибка в запросе, просто уже не могу понять в чем дело/, казалось бы всё очень просто: есть у меня две таблицы и нужно мигрировать данные из одного поля (символьный тип) в другое (numeric(10,3)), причем буквально перед выполнением миграции изменил тип получателя с int на numeric(10,3), миграцию делается по 3 кодам

update n
set n.pw = CASE WHEN ISNUMERIC(r.field11) <> 1 THEN 0 ELSE RTRIM(replace(r.field11,',','.')) END
FROM [DNRR].[dbo].[res1] r inner join [DNRR_test2].[dbo].[rich_] n on n.field4 = r.ndoc and n.field5 = r.ddoc and n.resid = r.resid


так вот при выполнении запроса ошибка
Сообщение 245, уровень 16, состояние 1, строка 1
Conversion failed when converting the varchar value '39.3' to data type int.

такое впечатление, что система запомнила, что ранее та был тип int

Сообщение было отредактировано: 25 сен 18, 16:03
25 сен 18, 16:02    [21685598]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
patrick1968,

Злопамятная какая...
int старше varchar по этому прифодит к нему.
что вы этим хотите получить не понятно RTRIM(replace(r.field11,',','.'))
25 сен 18, 16:05    [21685602]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
я так понимаю вам это надо
THEN '0'
25 сен 18, 16:08    [21685609]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
patrick1968
Member

Откуда:
Сообщений: 451
field11 - char поэтому RTRIM - в этой строке может быть что угодно, только вашего ответа не понял, что значит int старше?
25 сен 18, 16:10    [21685613]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
TaPaK
я так понимаю вам это надо
THEN '0'


подозреваю, что n.pw имеет тип numeric(10,3)
и поэтому скорее надо RTRIM(replace(r.field11,',','.')) приводить к numeric
25 сен 18, 16:11    [21685614]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
patrick1968
Member

Откуда:
Сообщений: 451
да если не распознано, значит 0 в противном случае число
25 сен 18, 16:12    [21685622]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Посетитель
TaPaK
я так понимаю вам это надо
THEN '0'


подозреваю, что n.pw имеет тип numeric(10,3)
и поэтому скорее надо RTRIM(replace(r.field11,',','.')) приводить к numeric

та может, во всём тексте нет названия колонки которую он менял :) Но при этом даже оставив '0' всё равно будет пытаться скрафтить numeric.
25 сен 18, 16:12    [21685623]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
patrick1968
да если не распознано, значит 0 в противном случае число

новых символов не заметили?
25 сен 18, 16:13    [21685625]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
patrick1968
Member

Откуда:
Сообщений: 451
да и к numeric приводил тоже - не помогло
25 сен 18, 16:13    [21685628]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
patrick1968,
Вы хотите сказать, что у Вас столбец pw был формата int и строка "39.3" в него не входила, а теперь Вы сделали его в формате numeric(10,3) и ожидаете, что явное присванивание текста "39.3", который получается из текста "39,3" - пройдет успешно??

set n.pw = CASE WHEN ISNUMERIC(r.field11) <> 1 THEN 0 ELSE RTRIM(replace(r.field11,',','.')) END

Сделайте так. Отделите рубли от копеек, 39*100+3, получите явно int, а затем записываете

set n.pw = CASE WHEN ISNUMERIC(r.field11) <> 1 THEN convert(numeric(10,3),0)
ELSE convert(numeric(10,3), convert(double, convert(int,'рубли из поля r.field11')*100+convert(int,'копейки из поля r.field11'))/convert(double,100)) END

Как отделить рубли от копеек - надеюсь, понятно, берете запятую и все, что слева - рубли, все, что справа - копейки, если одна цифра, умножаете на 10, то есть 39,3 - это не 3 копейки, а 30 копеек.

Понятно?
25 сен 18, 16:14    [21685629]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Andy_OLAP,

Ржал аки конь, таким только детей пугать
25 сен 18, 16:15    [21685636]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Andy_OLAP
patrick1968,
Вы хотите сказать, что у Вас столбец pw был формата int и строка "39.3" в него не входила, а теперь Вы сделали его в формате numeric(10,3) и ожидаете, что явное присванивание текста "39.3", который получается из текста "39,3" - пройдет успешно??

set n.pw = CASE WHEN ISNUMERIC(r.field11) <> 1 THEN 0 ELSE RTRIM(replace(r.field11,',','.')) END

Сделайте так. Отделите рубли от копеек, 39*100+3, получите явно int, а затем записываете

set n.pw = CASE WHEN ISNUMERIC(r.field11) <> 1 THEN convert(numeric(10,3),0)
ELSE convert(numeric(10,3), convert(double, convert(int,'рубли из поля r.field11')*100+convert(int,'копейки из поля r.field11'))/convert(double,100)) END

Как отделить рубли от копеек - надеюсь, понятно, берете запятую и все, что слева - рубли, все, что справа - копейки, если одна цифра, умножаете на 10, то есть 39,3 - это не 3 копейки, а 30 копеек.

Понятно?


вы там на своем как бы радио как бы совсем уже?
25 сен 18, 16:15    [21685637]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
patrick1968
да и к numeric приводил тоже - не помогло

совсем других символов не видите??
напишите тогда так
WHEN ISNUMERIC(r.field11) <> 1 THEN 0.0
25 сен 18, 16:16    [21685638]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
TaPaK
Andy_OLAP,

Ржал аки конь, таким только детей пугать

Я не понимаю, в чем причина юмора, я же не предлагаю автору темы готовое решение, я предлагаю ему подумать над проблемой глубже и со стороны и показывают путь размышлений.
25 сен 18, 16:16    [21685640]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Andy_OLAP
TaPaK
Andy_OLAP,

Ржал аки конь, таким только детей пугать

Я не понимаю, в чем причина юмора, я же не предлагаю автору темы готовое решение, я предлагаю ему подумать над проблемой глубже и со стороны и показывают путь размышлений.


вы предлагаете взглянуть на гланды через анус.
так то оно конечно понятнее, но далеко не всем.
25 сен 18, 16:19    [21685645]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
KRS544
Member

Откуда:
Сообщений: 497
а так
update n
set n.pw = isnull( try_convert(numeric(10,3),RTRIM(replace(r.field11,',','.'))) ,0)
FROM [DNRR].[dbo].[res1] r inner join [DNRR_test2].[dbo].[rich_] n on n.field4 = r.ndoc and n.field5 = r.ddoc and n.resid = r.resid
25 сен 18, 16:19    [21685647]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Andy_OLAP
TaPaK
Andy_OLAP,

Ржал аки конь, таким только детей пугать

Я не понимаю, в чем причина юмора, я же не предлагаю автору темы готовое решение, я предлагаю ему подумать над проблемой глубже и со стороны и показывают путь размышлений.

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

1. Ошибка varchar value '39.3' to data type int.
2. Тип поля numeric(10,3)
откуда, то стойло что вы в кейсе настучали?

Ошибка возникает из за того что CASE всё приводит к старшему типу. Старший тип тит int из-за 0.
Привести все WHEN к одному вот и всё решение
25 сен 18, 16:21    [21685651]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Посетитель
вы предлагаете взглянуть на гланды через анус.

Я предлагаю искать любой разделитель между рублями и копейками, получать сумму в копейках - которая может вылезти за пределы int, затем делить обратно на 100 и приводить к numeric(10,3). Я предлагаю автору темы подумать над тем, что все replace явно завязаны на предположение, что софт, работающий с таблицей, будет всегда в varchar столбцы записывать суммы с разделителем в виде запятой. А софт с какого-то момента может обновиться, и половина записей будет с одним разделителем, половина записей с другим.

Так более понятно?
25 сен 18, 16:28    [21685666]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Andy_OLAP
Посетитель
вы предлагаете взглянуть на гланды через анус.

Я предлагаю искать любой разделитель между рублями и копейками, получать сумму в копейках - которая может вылезти за пределы int, затем делить обратно на 100 и приводить к numeric(10,3). Я предлагаю автору темы подумать над тем, что все replace явно завязаны на предположение, что софт, работающий с таблицей, будет всегда в varchar столбцы записывать суммы с разделителем в виде запятой. А софт с какого-то момента может обновиться, и половина записей будет с одним разделителем, половина записей с другим.

Так более понятно?

ага, любой разделитель

автор
Как отделить рубли от копеек - надеюсь, понятно, берете запятую и все, что слева - рубли,
25 сен 18, 16:30    [21685671]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
patrick1968
Member

Откуда:
Сообщений: 451
update n
set n.eim = CASE WHEN ISNUMERIC(r.field11) <> 1 THEN 0.0 ELSE CAST(LTRIM(RTRIM(REPLACE(r.field11,',','.'))) as numeric(10,3)) END
FROM [DNRR].[dbo].[res1] r inner join [DNRR_test2].[dbo].[rich_] n on n.field4 = r.ndoc and n.field5 = r.ddoc and n.resid = r.resid

И даже в таком исполнении результат такой же
25 сен 18, 16:31    [21685672]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
patrick1968
update n
set n.eim = CASE WHEN ISNUMERIC(r.field11) <> 1 THEN 0.0 ELSE CAST(LTRIM(RTRIM(REPLACE(r.field11,',','.'))) as numeric(10,3)) END
FROM [DNRR].[dbo].[res1] r inner join [DNRR_test2].[dbo].[rich_] n on n.field4 = r.ndoc and n.field5 = r.ddoc and n.resid = r.resid

И даже в таком исполнении результат такой же

тот же это какой?
25 сен 18, 16:32    [21685674]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
+ объект ошибки. Может там триггер
25 сен 18, 16:34    [21685679]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
patrick1968
Member

Откуда:
Сообщений: 451
Error converting data type varchar to numeric.

Триггеров там нет
25 сен 18, 16:37    [21685689]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
patrick1968
Member

Откуда:
Сообщений: 451
я уже и поле поменял, там есть такого же типа, просто уже в тупике
25 сен 18, 16:39    [21685691]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при выполнении запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
patrick1968,

что выводит
25 сен 18, 16:41    [21685698]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить