首页 > 解决方案 > 在 Concat Multiple Column 时克服 Sybase ASE 系统中的 255 char 限制

问题描述

我在 Sybase 中有一个 39 列和 30 行的表。我试图将所有 39 列连接到一个 30 行的列中。

使用的工具:Winsql Professional 4.5 连接Sybase DB

  1. table1 有实际数据
  2. 创建了一个数据类型文本的临时表 2。创建表 #temp2(行文本)
  3. 使用修剪空间插入和格式化,空值并尝试使用 + 符号从 table1 连接到 temp table2

结果:数据被截断为 256 个字符

调查结果:Sybase ASE 文本数据类型仅支持 255 个字符

有人可以建议如何克服这个问题!

标签: concatenationmultiple-columnssybasetruncated

解决方案


Sybase ASE 的文本数据类型不限于 256 个字符,但有一些技巧可以成功使用它,例如指定 textsize 并注意这些设置可能是特定于会话和存储过程的。

请考虑以下 Linux 上的 Sybase ASE 16.0 GA 示例:

然后创建 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 行。

由于我自己的实例只有 2K 页,因此我将自己限制为每列 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_1 中列的连接值将行插入 table_2。对于 table_1 中的每一行,table_2 中将有一行。


    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


检查 table_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() 返回的值不会被截断,除非输入数据被截断。

在 Windows 2000 上安装 Sybase ASE 12.5.1 并将其配置为 16K 页后,上述命令在名为“rwc”的数据库中执行。这些命令像宣传的那样工作。

在此处输入图像描述


推荐阅读