![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема исспользования строковых ф-ций в SQL-запросе [IB5.x]
LizaX © (2004-07-12 11:44:00)Уважаемые мастера, помогите, пожалуйста, решить следующую проблему.
InterBase5.5. Имеется поле таблицы, тип данных - VARCHAR(150).
Нужно из строки выделить 8 последних знаков, и убрать последний.
Пример строки:
№дог.0096_Кооператив "Темп"_кафе_75365194_1605334_Применяю такой запрос:
SELECT networkitemid, substr(networkitemname, strlen(networkitemname)-7, strlen(networkitemname)-1)
from networkitem where networkitemname like '№%'
При выполнении в IB EXPERT выпадает сообщение:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
A fatal exception occurred during the execution of a user defined function.
arithmetic exception, numeric overflow, or string truncation.
и на выходе получаю 14 строк вместо 1958.
LizaX (2004-07-12 16:23:00) [1]Получается такая картина.
В UDF - SUBSTR:
SET NAMES WIN1251;
DECLARE EXTERNAL FUNCTION SUBSTR
CSTRING(80),
SMALLINT,
SMALLINT
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf.dll';
В 15-й строке колличество символов - 87.
Теперь понятно откуда ноги растут.
Reindeer Moss Eater (2004-07-12 12:53:00) [2]Тогда трассировка UDF поможет
LizaX (2004-07-12 12:52:00) [3]
> Он, кстати, какой вообще?
Pdox ANSI Cyrillic.
В предыдущих 14 строках тоже проскакивали украинские символы.
Johnmen (2004-07-12 12:51:00) [4]substr(networkitemname, strlen(networkitemname)-7, 7)
и
where strlen(networkitemname)>7
Курдль (2004-07-12 12:51:00) [5]
> LizaX © (12.07.04 12:23) [13]
> Ребята, прошу не смеяться и не улююкать. Что имеем то имеем.
> Если возможно - помогите.
Да никто не смеется - все Вам сочувствуют. Поэтому я еще раз прошу отнестись серьезно к моим словам.
Создайте нормальную БД, а не "..._1605334_
содержит в себе уникальный код из другой таблицы."
Перелейте туда данные из старой базы.
Обоснуйте и срубите с заказчика адекватную оплату.
Если Вам не хватает информации, чтобы убедить заказчика отказаться от этого бреда собачего - обращайтесь к нам!
Desdechado (2004-07-12 12:48:00) [6]как описаны функции substr и strlen, откуда они взяты?
в какой-то из поставочных реализаций был баг в ней, очень похожий на твой
Reindeer Moss Eater (2004-07-12 12:45:00) [7]А не языковый ли драйвер виноват, если валится на ""Баришівський"_ТП 330 Технологічне відділення...." ?
Он, кстати, какой вообще?
LizaX (2004-07-12 12:40:00) [8]
> Так ведь уже помогли...
> Добавить в WHERE
> strlen(networkitemname)>7
Запрос
SELECT count(*)
from networkitem where networkitemname like '№%' and strlen(networkitemname) <= 7
Возвращает - 0.
Reindeer Moss Eater (2004-07-12 12:38:00) [9]Открыть исходник FreeUDFLib, внести логирование внутри этих функций.
LizaX (2004-07-12 12:34:00) [10]
> а откуда ИДФ? самописная или FreeUDFLib?
FreeUDFLib
Соловьев (2004-07-12 12:31:00) [11]
> strlen
а откуда ИДФ? самописная или FreeUDFLib?
Курдль (2004-07-12 12:27:00) [12]
> LizaX © (12.07.04 12:15) [12]
> > Зачем столь замысловатая обработка строки?
> Так уж получилось (не моя вина), что строка
Вариантов много.
1. Убейте того, кто создал такую структуру.
2. Увольтесь оттуда, где Вас заставляют делать ТАКОЕ.
3. Если все-таки работа одноразовая и Вам надо просто перелить данные из чьей-то тупой базы в свою супер-правильную, то создайте одноразовый проект, получите весь набор данных на клиента и там неспешно обработайте средствами Delphi, а не SQL.
Deniz (2004-07-12 12:27:00) [13]А это обязательно в select обрабатывать, или может на клиенте или в ХП?
Johnmen (2004-07-12 12:26:00) [14]Так ведь уже помогли...
Добавить в WHERE
strlen(networkitemname)>7
Соловьев (2004-07-12 12:25:00) [15]предлагаю оформить этот запрос в виде ХП и дебагером пройтись, и точно выявить запись.
LizaX (2004-07-12 12:23:00) [16]
> А что у нас в строке 15?
В строке 15:
№дог.0073_Шовко-радгосп "Баришівський"_ТП 330 Технологічне відділення_6942233_1603973_
Данные очень корявые.
Ребята, прошу не смеяться и не улююкать. Что имеем то имеем. Если возможно - помогите.
LizaX (2004-07-12 12:15:00) [17]
> Зачем столь замысловатая обработка строки?
Так уж получилось (не моя вина), что строка №дог.0096_Кооператив "Темп"_кафе_75365194_ 1605334_
содержит в себе уникальный код из другой таблицы. Но именно из таблицы, которая ВАМ так не нравится необходимо выдрать данные, идентифицируя их именно по этому коду и потом обновить эти данные в другой таблице.
Johnmen (2004-07-12 12:14:00) [18]>LizaX ©
Это правильно, что ты пришла сюда, не найдя ответа на
http://sql.ru/forum/actualthread.aspx?bid=2&tid=105869
:)
Но не хватает исходных данных.
В целом Reindeer Moss Eater © (12.07.04 11:57) [3]
Соловьев (2004-07-12 12:10:00) [19]
> Если бы было по другому представлено, то я бы советов не
> просила.
так сделайте - оградите себя от многих проблем.
Соловьев (2004-07-12 12:08:00) [20]
> Таких строк нет. Я проверяла.
как?