Pull to refresh

Обрезка ответа на sql-запрос

Reading time 2 min
Views 1.4K
UPDATE!

Проблема решена после внимательного изучения документации по формату idc. Длина колонки в нем по умолчанию равна 8192 байта, а все что меньше просто обрезается. Прямо так и написано. Для вывода информации свыше этого есть специальный ключ MaxFieldSize, значением которого является максимальная длина ответа в байтах. Приведу цитату, может кому пригодится:
The MaxFieldSize field specifies the maximum number of bytes allocated by the IDC for each field in the .idc file.
--------------------------------------------------------------------------------
NOTE: The default field size is 8,192 bytes. If a query results in more bytes than allocated by the IDC MaxFieldSize field, subsequent data is truncated.
--------------------------------------------------------------------------------
To specify a MaxFieldSize of 64,000 bytes, use the following syntax in the MaxFieldSize field entry:
MaxFieldSize: 64000


UPDATE!

Дорогой Хабрахабр, я пришел спросить твоего совета. Перерыл все что только можно и не могу найти решения.
Имеет место следующая проблема:
На MS SQL 2000 сервере есть база данных, в которой есть таблица, в которой есть столбец типа text. В нем хранятся данные (новости), которые надо постоянно показывать. Пользователь вызывает скрипт, которой обрабатывает IIS.
Скрипт состоит из двух файлов — script.idc и template.htx. Это старая технология, позволяющая разделить запрос к БД и шаблон оформления, в котором результат запроса выдается.
Содержимое script.idc:
DataSource: sqlserv_tcp
Username: user1
Password: pass1
Template: template.htx
SQLStatement:
+SELECT mes_text ne_text FROM news_text (nolock) WHERE mes_id = '%mes_id%' and source_code = 'Source1'


Содержимое template.htx:
<%begindetail%><%ne_text%>
<%enddetail%>


К этому скрипту обращается программа-клиент под винду.
Суть проблемы — отрезаются данные свыше 8 килобайт. Это не зависит от клиента, т.к. при открытии URL через браузер все точно также. Перепроверили все. Сервер отдает данные полностью. Грешим на внутренние ограничения ODBC или технологии IDC-файлов, но ничего подобного в мануалах и документации я не нашел. Причем, имеется возможность задавать ключ в файле:
ODBCOptions: SQL_MAX_LENGTH= Integer,
задающий максимальную длину в байтах, возращаемых в ответе на запрос, который как ни странно не работает.

Пока что я решил проблему созданием двойного запроса, но он не универсален и работает только для новостей менее 16 кб, что неприемлемо. Вот он, запрос:
DECLARE @len int
SELECT @len=DATALENGTH(mes_text) FROM news_text (nolock) WHERE mes_id = '%mes_id%' AND source_code = Source1'
IF @len > 6000
BEGIN
SELECT SUBSTRING(mes_text,1,6000) ne_text, 1 sort FROM news_text (nolock) WHERE mes_id = '%mes_id%' AND source_code = 'Source1'
UNION
SELECT SUBSTRING(mes_text,6001,DATALENGTH(mes_text)) ne_text2, 2 sort FROM news_text (nolock) WHERE mes_id = '%mes_id%' AND source_code = 'Source1'
ORDER BY sort
END
ELSE
SELECT mes_text ne_text FROM news_text (nolock) WHERE mes_id = '%mes_id%' AND source_code = 'Source1'


Может кто сталкивался, или есть идеи? Уже несколько дней бьюсь головой в монитор… :)
Tags:
Hubs:
+3
Comments 36
Comments Comments 36

Articles