Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
patrick1968 Member Откуда: Сообщений: 473 |
Добрый день. Получается у меня ошибка в запросе, просто уже не могу понять в чем дело/, казалось бы всё очень просто: есть у меня две таблицы и нужно мигрировать данные из одного поля (символьный тип) в другое (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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
patrick1968, Злопамятная какая... int старше varchar по этому прифодит к нему. что вы этим хотите получить не понятно RTRIM(replace(r.field11,',','.')) |
25 сен 18, 16:05 [21685602] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
я так понимаю вам это надо THEN '0' |
25 сен 18, 16:08 [21685609] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 473 |
field11 - char поэтому RTRIM - в этой строке может быть что угодно, только вашего ответа не понял, что значит int старше? |
25 сен 18, 16:10 [21685613] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
подозреваю, что n.pw имеет тип numeric(10,3) и поэтому скорее надо RTRIM(replace(r.field11,',','.')) приводить к numeric |
||
25 сен 18, 16:11 [21685614] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 473 |
да если не распознано, значит 0 в противном случае число |
25 сен 18, 16:12 [21685622] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
та может, во всём тексте нет названия колонки которую он менял :) Но при этом даже оставив '0' всё равно будет пытаться скрафтить numeric. |
||||
25 сен 18, 16:12 [21685623] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
новых символов не заметили? |
||
25 сен 18, 16:13 [21685625] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 473 |
да и к numeric приводил тоже - не помогло |
25 сен 18, 16:13 [21685628] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Andy_OLAP, Ржал аки конь, таким только детей пугать |
25 сен 18, 16:15 [21685636] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
вы там на своем как бы радио как бы совсем уже? |
||
25 сен 18, 16:15 [21685637] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
совсем других символов не видите?? напишите тогда так WHEN ISNUMERIC(r.field11) <> 1 THEN 0.0 |
||
25 сен 18, 16:16 [21685638] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
Я не понимаю, в чем причина юмора, я же не предлагаю автору темы готовое решение, я предлагаю ему подумать над проблемой глубже и со стороны и показывают путь размышлений. |
||
25 сен 18, 16:16 [21685640] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
вы предлагаете взглянуть на гланды через анус. так то оно конечно понятнее, но далеко не всем. |
||||
25 сен 18, 16:19 [21685645] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
вы генерируете бред, основанный на ваших личных ассоциациях, абсолютно не связанных с вопросами. 1. Ошибка varchar value '39.3' to data type int. 2. Тип поля numeric(10,3) откуда, то стойло что вы в кейсе настучали? Ошибка возникает из за того что CASE всё приводит к старшему типу. Старший тип тит int из-за 0. Привести все WHEN к одному вот и всё решение |
||||
25 сен 18, 16:21 [21685651] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
Я предлагаю искать любой разделитель между рублями и копейками, получать сумму в копейках - которая может вылезти за пределы int, затем делить обратно на 100 и приводить к numeric(10,3). Я предлагаю автору темы подумать над тем, что все replace явно завязаны на предположение, что софт, работающий с таблицей, будет всегда в varchar столбцы записывать суммы с разделителем в виде запятой. А софт с какого-то момента может обновиться, и половина записей будет с одним разделителем, половина записей с другим. Так более понятно? |
||
25 сен 18, 16:28 [21685666] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
ага, любой разделитель
|
||||||
25 сен 18, 16:30 [21685671] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 473 |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
тот же это какой? |
||
25 сен 18, 16:32 [21685674] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
+ объект ошибки. Может там триггер |
25 сен 18, 16:34 [21685679] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 473 |
Error converting data type varchar to numeric. Триггеров там нет |
25 сен 18, 16:37 [21685689] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 473 |
я уже и поле поменял, там есть такого же типа, просто уже в тупике |
25 сен 18, 16:39 [21685691] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
patrick1968, что выводит |
25 сен 18, 16:41 [21685698] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |