Преодолеть ограничения в 255 символов в системе Sybase ASE при использовании Concat Multiple Column - PullRequest
0 голосов
/ 10 января 2020

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

Используемые инструменты: Win sql professional 4.5 подключиться к Sybase DB

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

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

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

Может кто-нибудь подсказать, как решить эту проблему!

1 Ответ

0 голосов
/ 12 января 2020

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

Рассмотрим следующий пример 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 настроен на 2K страниц. Экземпляры размером 16K не получат это предупреждение. Усечение произойдет только в том случае, если размер строки станет больше размера страницы:

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

Вставьте строки в table_1. В идеале, с 16K-страницами и столбцами по 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 i sql, мы можем показать, что Sybase ASE правильно объединяет значения и сохраняет их в текстовом столбце. Вы используете "win sql", инструмент, с которым я не знаком и не имею доступа. Я предполагаю, что это может накладывать некоторые ограничения на то, что отображается. Я подозреваю, что где-то это может быть запущено:

set textsize 255

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

После установки Sybase ASE 12.5.1 на Windows 2000 и настройки его для страниц размером 16 КБ указанные выше команды были выполнены в базе данных с именем "rw c". Команды работали как объявлено.

enter image description here

...