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

  • Вопрос

  • Имеет место следующая проблема:
    На 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'


    Может кто сталкивался, или есть идеи?

    16 сентября 2008 г. 13:24

Ответы