Имеет место следующая проблема:
На 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'
Может кто сталкивался, или есть идеи?