Вернуть столбец длиной более 16384 байт

Я использую базу данных 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 КБ.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В 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>))

Использованная литература:

Тип данных изображения — BINARY, а не TEXT…

SQLpro 16.05.2024 16:45

@sqlpro да, я знаю разницу между типами данных image (двоичный) и text (текст); какая твоя точка зрения?

markp-fuso 16.05.2024 16:58

Спасибо! Это сработало, когда я выполнил запрос с помощью pymssql, результат уже проанализирован

PeByte 16.05.2024 17:20

@PeByte да, это должно быть (в некоторой степени) базовой функцией любой базы данных/инструмента запросов; приятно слышать, что это было простое изменение

markp-fuso 16.05.2024 17:22

Как сказал markp-fuso, вы можете использовать readtext, единственное, что я добавил, — это длину данных, чтобы правильно использовать размер.

select @len = datalength (field) ... 
readtext table.column @val 0 @len

хороший момент: используя datalength(), вам понадобится только один readtext звонок; хотя я понимаю ограничения в 16 КБ на вызовы convert(), я отвлекся, думая, что у вас была какая-то явная причина для извлечения данных обратно частями по 16 КБ, отсюда и упоминание о цикле для многократного запуска readtext

markp-fuso 16.05.2024 17:32

Другие вопросы по теме