将众多字符串组合成一行

时间:2018-10-17 11:45:00

标签: sql-server tsql

我遇到以下问题。

我的示例数据如下:

03D 03F 03G 03H 03I 04E 05D 05G 05H 06C 08D 08D (BEST) 08E 08E (BEST) 08F 08F (BEST) 08G 08G (BEST) 08H 08H (BEST) 08I 08I (BEST) 08J 08K 08k08K 08L 08L (BEST)

我需要将此数据合并为一个字符串,如下所示:

03D;03F;03G;03H;03I;04E;05D;05G;05H;06C;08D;08D (BEST);08E;08E (BEST);08F;08F (BEST);08G;08G (BEST);08H;08H (BEST);08I;08I (BEST);08J;08K;08k08K;08L;08L (BEST);

请注意,此表中始终会添加数据,因此,我需要准确地运行该数据,以使用此结果更新单个字段。

应使用此运算符;

分割不同的值

我试图实现的脚本是:

declare @loop   int
,       @Tempid int
,       @lookup varchar(max)

    declare @bin table
    (id  int identity primary key, bin varchar(100))

    insert into @bin (bin)
    select distinct
    cBinLocationName
    from    _btblBinLocation

    set @lookup =   ''
                begin
                    select @Loop = min(ID) FROM @bin
                    while @Loop IS NOT NULL
                        begin
                        set @Tempid =   (select id from @bin where id=@Loop)
                            set @lookup =   @lookup + (select bin FROM @bin where ID=@Tempid)+';'
                            select @Loop = min(ID) FROM @bin where ID>@Loop
                        end
                end
    select  @lookup

问题是,我的结果一直是''

请帮助?

2 个答案:

答案 0 :(得分:0)

我通过导航到Larnu在评论中发布的链接来解决它。

我更改了答案以适合我,以下是脚本:

select top 1  stuff((select distinct cBinLocationName + ';'
            from _btblBINLocation
        for xml path('')), 1, 1, '') as lookup
from _btblBINLocation

这正是我想要的。有了这些结果,我将能够基于此更新字段。

谢谢大家。

结果如下:

enter image description here

答案 1 :(得分:0)

这是一个简单的示例,不需要XML和STUFF:

DECLARE @TestData TABLE
    (
        [TestData] NVARCHAR(200)
    );

DECLARE @Del CHAR(1) = ';';
DECLARE @Lookup NVARCHAR(MAX) = '';

INSERT INTO @TestData (
                          [TestData]
                      )
VALUES ( '03D' )
     , ( '03F' )
     , ( '03G' )
     , ( '03H' )
     , ( '03I' )
     , ( '04E' )
     , ( '05D' )
     , ( '05G' )
     , ( '05H' )
     , ( '06C' )
     , ( '08D' )
     , ( '08D (BEST)' )
     , ( '08E' )
     , ( '08E (BEST)' )
     , ( '08F' )
     , ( '08F (BEST)' )
     , ( '08G' )
     , ( '08G (BEST)' )
     , ( '08H' )
     , ( '08H (BEST)' )
     , ( '08I' )
     , ( '08I (BEST)' )
     , ( '08J' )
     , ( '08K' )
     , ( '08k08K' )
     , ( '08L' )
     , ( '08L (BEST)' );

--puts the result set into @Lookup
SELECT @Lookup = @Lookup + [TestData] + @Del
FROM   @TestData;

--Remove the trailing delimiter
SET @Lookup = SUBSTRING(@Lookup, 1, LEN(@Lookup) - 1);

SELECT @Lookup;