代码之家  ›  专栏  ›  技术社区  ›  Stephanie

使用合并进行连接时,大于9的数字显示为星号*

  •  0
  • Stephanie  · 技术社区  · 7 年前

    我想将多行中的值连接到一行中。我正在为此目的使用COALESCE。我有一个列是ID列。连接ID列时,最多可正确显示9的值,但在9之后,将显示星号。有人知道这是为什么吗?请参阅下面我的代码,使用COALESCE将所有行连接在一个行中:

    CREATE TABLE #test
    (id int, name varchar(50))
    insert into #test
    values(1, 'ana'),
    (2, 'bob'),
    (3, 'steph'),
    (4, 'bill'),
    (5, 'john'),
    (6, 'jose'),
    (7, 'kerry'),
    (8, 'frank'),
    (9, 'noah'),
    (10, 'melissa')
    
    --SELECT * FROM #test 
    
    DECLARE @NameAndID VARCHAR(1000)
    SELECT @NameAndID = COALESCE(@NameAndID +'; ', '') + CAST(ID AS VARCHAR(1))+'. ' + name
    FROM #test 
    
    SELECT @NameAndID
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Zohar Peled    7 年前

    varchar(1) -任何超过一个数字的数字都会溢出一个字符,因此会变成星号( * ).

    在使用INT时,我发现最好使用它 varchar(11)
    这个 int 最小值为-2147483648-删除千位分隔符它是10位数字和一个减号:

    -2147483648
    123456789 1 (10 is missing in the chars count to make it more clear)
    

    顺便说一下,在T-Sql中有更好的字符串聚合方法。

    stuff 和 for xml path ,例如:

    SELECT STUFF(
        (
            SELECT '; ' + CAST(id as varchar(11)) + '. ' + name
            FROM #test
            FOR XML PATH('')
        ),1 ,2, '')
    

    对于2017版或更高版本,请使用内置 string_agg

    SELECT STRING_AGG(CAST(id as varchar(11)) + '. '+ name, '; ')
    FROM #Test
    

    有关更多信息,请查看 this SO post.

        2
  •  1
  •   Salman Arshad    7 年前

    这个 * 结果长度(was)太短,无法显示 . 在您的示例中,您试图将一个两位数的数字放入 VARCHAR(1) . 在这种特殊情况下,结果是 * 而不是抛出错误。

    行为 is described in the docs .