Я использую базу данных sybase ase 15. И у меня есть столбец типа image (в этом столбце хранятся SQL-запросы), поэтому мне нужно преобразовать его в varchar, чтобы вернуть текст. Проблема в том, что я не могу вернуть более 16834 байт, а запрос возвращается обрезанным.
Есть ли способ получить весь столбец? В настоящее время я использую скрипт с библиотекой pymssql в Python.
И запрос, который я использую,
select (convert varchar(16834), convert(varbinary(16834), FIELD)) as 'SQL' from TABLE WHERE ...
Я попытался поставить max вместо 16834, но он возвращает ошибку, так как не распознается как переменная, приводит ее к типу TEXT, но также не возвращает полный размер столбца. Тип данных столбца — IMAGE, а более тяжелое поле — 40 КБ, но возвращает только 16 КБ.


В transact-sql вы можете просто сослаться на столбец (никакие функции не нужны), и ASE вернет все содержимое столбца, например, следующего должно быть достаточно:
select FIELD from TABLE
ПРИМЕЧАНИЕ. Я не работаю с python/pmssql, но ожидаю, что он знает, как обрабатывать длинный поток данных, возвращаемый из типа данных text/image.
Если по какой-то причине python/pmmsql не имеет возможности обрабатывать один длинный поток данных, вы можете воспользоваться командой readtext, чтобы разбить данные на фрагменты.
Базовый пример использования readtext для чтения фрагмента данных из столбца:
declare @val varbinary(16)
select @val = textptr(copy) -- obtain the text pointer for <column_name>
from blurbs -- from <table_name>
where au_id = "648-92-1872"
readtext blurbs.copy -- <table_name>.<column_name> being read
@val 1 5 -- text pointer, offset, length
В данном случае мы читаем первые 5 байтов. В вашем случае вы бы использовали цикл для многократного вызова readtext для последующих фрагментов по 16 КБ (т. е. @val 1 16384, @val 16385 16384, @val 32769 16384, ...). (или, как выяснил PeByte: сделайте один вызов readtext, где последний аргумент является результатом datelength(<column_name>))
Использованная литература:
@sqlpro да, я знаю разницу между типами данных image (двоичный) и text (текст); какая твоя точка зрения?
Спасибо! Это сработало, когда я выполнил запрос с помощью pymssql, результат уже проанализирован
@PeByte да, это должно быть (в некоторой степени) базовой функцией любой базы данных/инструмента запросов; приятно слышать, что это было простое изменение
Как сказал markp-fuso, вы можете использовать readtext, единственное, что я добавил, — это длину данных, чтобы правильно использовать размер.
select @len = datalength (field) ...
readtext table.column @val 0 @len
хороший момент: используя datalength(), вам понадобится только один readtext звонок; хотя я понимаю ограничения в 16 КБ на вызовы convert(), я отвлекся, думая, что у вас была какая-то явная причина для извлечения данных обратно частями по 16 КБ, отсюда и упоминание о цикле для многократного запуска readtext
Тип данных изображения — BINARY, а не TEXT…