TSQL选择逗号列表以显示行

TSQL选择逗号列表以显示行,tsql,Tsql,如何在行中转换逗号列表字段并在列中显示它 比如说, ID | Colour ------------ 1 | 1,2,3,4,5 致: 解决这个问题的通常方法是创建一个拆分函数。例如,你可以从谷歌(Google)抓到一个。创建函数后,您可以像这样使用它: create table colours (id int, colour varchar(255)) insert colours values (1,'1,2,3,4,5') select colours.id , spl

如何在行中转换逗号列表字段并在列中显示它

比如说,

ID | Colour
------------
1  | 1,2,3,4,5
致:


解决这个问题的通常方法是创建一个拆分函数。例如,你可以从谷歌(Google)抓到一个。创建函数后,您可以像这样使用它:

create table colours (id int, colour varchar(255))
insert colours values (1,'1,2,3,4,5')

select  colours.id
,       split.data
from    colours
cross apply
        dbo.Split(colours.colour, ',') as split
这张照片是:

id    data
1     1
1     2
1     3
1     4
1     5

另一种可能的解决方法是使用XML,假设您使用的是SQL Server 2005或更高版本:

DECLARE @s TABLE
    (
      ID INT
    , COLOUR VARCHAR(MAX)
    )

INSERT  INTO @s
VALUES  ( 1, '1,2,3,4,5' )

SELECT  s.ID, T.Colour.value('.', 'int') AS Colour
FROM    ( SELECT    ID
                  , CONVERT(XML, '<row>' + REPLACE(Colour, ',', '</row><row>') + '</row>') AS Colour
          FROM      @s a
        ) s
        CROSS APPLY s.Colour.nodes('row') AS T(Colour)

我知道这是一篇比较老的帖子,但我想我应该添加一个更新。理货表和基于cteTally表的拆分器都有一个主要问题。它们使用连接的分隔符,当元素变宽,字符串变长时,这会降低它们的速度

我已经解决了这个问题,并写了一篇关于它的文章,可以在下面的URL上找到

新方法为VARCHAR8000关闭了所有While循环、递归CTE和XML方法的大门


我还要告诉你,在本文的讨论中,一个名叫Peter的家伙甚至对代码做了改进。这篇文章仍然很有趣,我将在接下来的一两天用Peter的增强功能更新附件。在我的主要增强功能和tweek Peter制作的产品之间,我不相信您会找到一个更快的仅用于拆分VARCHAR8000的t-SQL解决方案。我还为VARCHARMAX解决了这类拆分器的问题,我正在为此写一篇文章。

还有一个以前被问过很多次的问题。。。一个这样的例子:@markbyers:这个数据库设计是为存储类似PHP网站的列表而优化的。这对SQL人员来说很糟糕,但对前端开发人员来说很方便。选择dbo.XW_Wheels.ID,dbo.SplitterXW_Wheels.colors,,“从XW_Wheels交叉应用dbo.SplitterXW_Wheels.colors,”,“as split AND I GET此消息找不到列dbo或用户定义函数或聚合dbo.Splitter,或名称不明确。请选择dbo.XW_Wheels.ID,从XW_Wheels分割交叉应用dbo.SplitterXW_Wheels.colors,”,'作为split,我得到的列名'split'无效。函数dbo.split返回一个表。尝试选择split.data,而不是仅仅选择split。@Rya:听起来您使用的剥离函数与SQL团队的剥离函数不同。使用select*查看返回的列名。啊,快照。价值split.value。谢谢你,安多玛,我可以吻你。。。但我不会:更好的是:选择T.name.value'.',选择CONVERTXML中的'nvarchar4000'作为颜色,+REPLACEname',',','选择'1,2,3,4,5'中的+作为名称交叉应用s.name.nodes'row'作为Tname
DECLARE @s TABLE
    (
      ID INT
    , COLOUR VARCHAR(MAX)
    )

INSERT  INTO @s
VALUES  ( 1, '1,2,3,4,5' )

SELECT  s.ID, T.Colour.value('.', 'int') AS Colour
FROM    ( SELECT    ID
                  , CONVERT(XML, '<row>' + REPLACE(Colour, ',', '</row><row>') + '</row>') AS Colour
          FROM      @s a
        ) s
        CROSS APPLY s.Colour.nodes('row') AS T(Colour)