Преодолеть ограничение в 255 символов в системе Sybase ASE при объединении нескольких столбцов

У меня есть таблица с 39 столбцами и 30 строками в Sybase. Я пытаюсь объединить все 39 столбцов в один столбец с 30 строками.

Используемые инструменты: Winsql Professional 4.5, подключение к Sybase DB.

  1. table1 имеет фактические данные
  2. Создал временную таблицу2 текста типа данных. Создать таблицу #temp2 (линейный текст)
  3. Вставить и отформатировать, используя обрезку для пробела, нулевые значения и попытаться объединить с помощью символа + во временную таблицу2 из таблицы1

Результат: данные усекаются до 256 символов.

Вывод: текстовый тип данных Sybase ASE поддерживает только 255 символов.

Может кто подскажет как побороть эту проблему!


person Bharathi Sivam    schedule 10.01.2020    source источник
comment
Столбец ASE text имеет ограничение в 2 ГБ; как упоминал Ричард, проблема (усечение данных), вероятно, связана с а) интерфейсным инструментом, который вы используете, б) настройками сеанса... и/или в) запросом, который вы используете (но не размещено), который вставляет данные в таблицу2   -  person markp-fuso    schedule 12.01.2020


Ответы (1)


Текстовый тип данных Sybase ASE не ограничен 256 символами, но есть некоторые хитрости для его успешного использования, такие как указание textsize и понимание того, что эти настройки могут зависеть от сеанса и хранимой процедуры.

Рассмотрим следующий пример Sybase ASE 16.0 GA в Linux:

Затем создайте таблицу из 39 столбцов.


    create table table_1 (      
    col_1   Varchar(255)    null,
    col_2   Varchar(255)    null,
    col_3   Varchar(255)    null,
    col_4   Varchar(255)    null,
    col_5   Varchar(255)    null,
    col_6   Varchar(255)    null,
    col_7   Varchar(255)    null,
    col_8   Varchar(255)    null,
    col_9   Varchar(255)    null,
    col_10  Varchar(255)    null,
    col_11  Varchar(255)    null,
    col_12  Varchar(255)    null,
    col_13  Varchar(255)    null,
    col_14  Varchar(255)    null,
    col_15  Varchar(255)    null,
    col_16  Varchar(255)    null,
    col_17  Varchar(255)    null,
    col_18  Varchar(255)    null,
    col_19  Varchar(255)    null,
    col_20  Varchar(255)    null,
    col_21  Varchar(255)    null,
    col_22  Varchar(255)    null,
    col_23  Varchar(255)    null,
    col_24  Varchar(255)    null,
    col_25  Varchar(255)    null,
    col_26  Varchar(255)    null,
    col_27  Varchar(255)    null,
    col_28  Varchar(255)    null,
    col_29  Varchar(255)    null,
    col_30  Varchar(255)    null,
    col_31  Varchar(255)    null,
    col_32  Varchar(255)    null,
    col_33  Varchar(255)    null,
    col_34  Varchar(255)    null,
    col_35  Varchar(255)    null,
    col_36  Varchar(255)    null,
    col_37  Varchar(255)    null,
    col_38  Varchar(255)    null,
    col_39  Varchar(255)    null)
    go

Я получаю предупреждение о возможных размерах строк, которые не помещаются на странице. Мой экземпляр Sybase ASE настроен на страницы размером 2 КБ. Экземпляры размером страницы 16 КБ не получат это предупреждение. Усечение произойдет только в том случае, если размер строки станет больше размера страницы:

Warning: Row size (10028 bytes) could exceed row size limit, which is 1962
bytes.

Вставьте строки в таблицу_1. В идеале, со страницами размером 16 КБ и столбцами с 255 символами можно использовать этот оператор вставки:


    insert into table_1 values (
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL01',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL02',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL03',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL04',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL05',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL06',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL07',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL08',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL09',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL10',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL11',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL12',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL13',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL14',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL15',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL16',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL17',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL18',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL19',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL20',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL21',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL22',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL23',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL24',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL25',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL26',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL27',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL28',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL29',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL30',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL31',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL32',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL33',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL34',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL35',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL36',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL37',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL38',
    '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789COL39')
    go 30

«Go 30» в конце отправляет пакет SQL 30 раз, вставляя 30 строк.

Поскольку мой собственный экземпляр имеет только 2 КБ страниц, я ограничиваю себя 45 символами в столбце, что составляет 1755 символов.

    insert into table_1 values (
    '0123456789012345678901234567890123456789COL01',
    '0123456789012345678901234567890123456789COL02',
    '0123456789012345678901234567890123456789COL03',
    '0123456789012345678901234567890123456789COL04',
    '0123456789012345678901234567890123456789COL05',
    '0123456789012345678901234567890123456789COL06',
    '0123456789012345678901234567890123456789COL07',
    '0123456789012345678901234567890123456789COL08',
    '0123456789012345678901234567890123456789COL09',
    '0123456789012345678901234567890123456789COL10',
    '0123456789012345678901234567890123456789COL11',
    '0123456789012345678901234567890123456789COL12',
    '0123456789012345678901234567890123456789COL13',
    '0123456789012345678901234567890123456789COL14',
    '0123456789012345678901234567890123456789COL15',
    '0123456789012345678901234567890123456789COL16',
    '0123456789012345678901234567890123456789COL17',
    '0123456789012345678901234567890123456789COL18',
    '0123456789012345678901234567890123456789COL19',
    '0123456789012345678901234567890123456789COL20',
    '0123456789012345678901234567890123456789COL21',
    '0123456789012345678901234567890123456789COL22',
    '0123456789012345678901234567890123456789COL23',
    '0123456789012345678901234567890123456789COL24',
    '0123456789012345678901234567890123456789COL25',
    '0123456789012345678901234567890123456789COL26',
    '0123456789012345678901234567890123456789COL27',
    '0123456789012345678901234567890123456789COL28',
    '0123456789012345678901234567890123456789COL29',
    '0123456789012345678901234567890123456789COL30',
    '0123456789012345678901234567890123456789COL31',
    '0123456789012345678901234567890123456789COL32',
    '0123456789012345678901234567890123456789COL33',
    '0123456789012345678901234567890123456789COL34',
    '0123456789012345678901234567890123456789COL35',
    '0123456789012345678901234567890123456789COL36',
    '0123456789012345678901234567890123456789COL37',
    '0123456789012345678901234567890123456789COL38',
    '0123456789012345678901234567890123456789COL39')
    go 30

Проверьте правильность введенного количества символов, это должна быть длина строки в каждом столбце. В моем случае 45.


    select
            char_length(col_1),
            char_length(col_2),
            char_length(col_3),
            char_length(col_4),
            char_length(col_5),
            char_length(col_6),
            char_length(col_7),
            char_length(col_8),
            char_length(col_9),
            char_length(col_10),
            char_length(col_11),
            char_length(col_12),
            char_length(col_13),
            char_length(col_14),
            char_length(col_15),
            char_length(col_16),
            char_length(col_17),
            char_length(col_18),
            char_length(col_19),
            char_length(col_20),
            char_length(col_21),
            char_length(col_22),
            char_length(col_23),
            char_length(col_24),
            char_length(col_25),
            char_length(col_26),
            char_length(col_27),
            char_length(col_28),
            char_length(col_29),
            char_length(col_30),
            char_length(col_31),
            char_length(col_32),
            char_length(col_33),
            char_length(col_34),
            char_length(col_35),
            char_length(col_36),
            char_length(col_37),
            char_length(col_38),
            char_length(col_39)
        from table_1
    go

Теперь создайте table_2 с текстовым столбцом.


    create table table_2 (col_1 text null)
    go

Вставьте строки в table_2 из конкатенированных значений столбцов в table_1. В таблице_2 будет одна строка для каждой строки в таблице_1.


    insert into table_2 select
            col_1 + 
            col_2 + 
            col_3 + 
            col_4 + 
            col_5 + 
            col_6 + 
            col_7 + 
            col_8 + 
            col_9 + 
            col_10 + 
            col_11 + 
            col_12 + 
            col_13 + 
            col_14 + 
            col_15 + 
            col_16 + 
            col_17 + 
            col_18 + 
            col_19 + 
            col_20 + 
            col_21 + 
            col_22 + 
            col_23 + 
            col_24 + 
            col_25 + 
            col_26 + 
            col_27 + 
            col_28 + 
            col_29 + 
            col_30 + 
            col_31 + 
            col_32 + 
            col_33 + 
            col_34 + 
            col_35 + 
            col_36 + 
            col_37 + 
            col_38 + 
            col_39 as result
    from table_1
    go


Проверьте длину столбца в таблице_2. При использовании 45 символов это должно быть 1755; при использовании 255 символов должно быть 9945.


    select char_length(col_1) from table_2
    go

Убедитесь, что последнее значение последней строки заканчивается на «COL39».


    select col_1 from table_2
    go

Что-то типа...

0123456789012345678901234567890123456789COL39

Учитывая, что приведенный выше тестовый пример был проведен с использованием утилиты Sybase isql, мы можем показать, что Sybase ASE правильно объединяет значения и сохраняет их в текстовом столбце. Вы используете "winsql", инструмент, с которым я не знаком и к которому у меня нет доступа. Я предполагаю, что это может накладывать некоторые ограничения на то, что отображается. Я подозреваю, что где-то это может быть запущено:

set textsize 255

или просто обрезать данные. Приведенный выше тестовый пример должен подтвердить это. Значения, возвращаемые функцией char_length(), не будут подвергаться усечению, если входные данные не будут усечены.

После установки Sybase ASE 12.5.1 в Windows 2000 и ее настройки для страниц размером 16 КБ приведенные выше команды были выполнены в базе данных с именем «rwc». Команды работали, как рекламируется.

введите здесь описание изображения

person Richard Crossley    schedule 12.01.2020
comment
Спасибо за предложения, мы не смогли решить проблему, так как версия Sybase кажется очень старой. Кроме того, в качестве альтернативы я решил использовать утилиту BCP для хранимой процедуры. Однако мой синтаксис дал сбой, указав приведенную ниже процедуру ошибки «xp_cmdshell», строка 2: › Не удается открыть соединение с сайтом «Test_XP». См. файл журнала ошибок в › каталоге загрузки SQL Server. Когда я проверил журналы, сервер XP с ядром 09 не запустился. Попробуйте поднять XP Server вручную. Проверьте документацию SQL Server для получения дополнительной информации. Любые предложения по использованию этой альтернативы BCP на SP??? - person Bharathi Sivam; 21.01.2020
comment
Можете ли вы сообщить нам версию Sybase ASE, которую вы используете select @@version, и размер логической страницы select @@maxpagesize - person Richard Crossley; 22.01.2020
comment
Возможно, вам потребуется настроить сервер XP в файле интерфейсов, используемое имя, вероятно, будет Test_XP. Сервер XP обычно не используется, потому что он выполняет команды в операционной системе. - person Richard Crossley; 22.01.2020
comment
Версия ниже 12.5.1.... select @@maxpagesize показывает ошибку Необходимо объявить переменную @@maxpagesize. - person Bharathi Sivam; 22.01.2020
comment
@Бхаратишивам. Я построил Sybase ASE 12.5.1 на Windows 2000 с 16K страницами, и сценарий работает так, как рекламируется. Я обновлю свой ответ скриншотом результата. - person Richard Crossley; 25.01.2020