Sql server 如何在多表列中拆分列值

Sql server 如何在多表列中拆分列值,sql-server,Sql Server,你能告诉我吗 如何跳水 ID SN Types 1 123 ABC,XYZ,TEST, RJK,CDF,TTT,UMB,UVX 2 234 RJK,CDF,TTT,UMB,UVX,TTT,UMB,UVX 3 345 OID,XYZ,TTT,UMB,UVX,TTT,UMB,UVX 作为 请给我发送sql代码 thanx,T-SQL不适合处理逗号分隔的值。但是,通过创造性地使用a,可以不费吹灰之力地拆分列。以下查询假设原始数据中一行中的类型总

你能告诉我吗 如何跳水

ID     SN    Types
1      123   ABC,XYZ,TEST, RJK,CDF,TTT,UMB,UVX
2      234   RJK,CDF,TTT,UMB,UVX,TTT,UMB,UVX
3      345   OID,XYZ,TTT,UMB,UVX,TTT,UMB,UVX
作为

请给我发送sql代码
thanx,

T-SQL不适合处理逗号分隔的值。但是,通过创造性地使用a,可以不费吹灰之力地拆分列。以下查询假设原始数据中一行中的类型总数不超过8个-可以简单地扩展以处理任意数量的类型(尽管不是动态的,但必须知道最大数量):

旋转后,最终输出如下所示:

| ID |  SN | TYPES1 | TYPES2 | TYPES3 | TYPES4 | TYPES5 | TYPES6 | TYPES7 | TYPES8 |
|----|-----|--------|--------|--------|--------|--------|--------|--------|--------|
|  1 | 123 |    ABC |    XYZ |   TEST |    RJK |    CDF |    TTT |    UMB |    UVX |
|  2 | 234 |    RJK |    CDF |    TTT |    UMB |    UVX |    TTT |    UMB |    UVX |
|  3 | 345 |    OID |    XYZ |    TTT |    UMB |    UVX |    TTT |    UMB |    UVX |

首先,创建一个保持顺序的拆分函数:

CREATE FUNCTION [dbo].[SplitStrings_Ordered]
(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT [Index] = ROW_NUMBER() OVER (ORDER BY Number), Item 
    FROM (SELECT Number, Item = SUBSTRING(@List, Number, 
      CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)
     FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
      FROM sys.all_objects) AS n(Number)
      WHERE Number <= CONVERT(INT, LEN(@List))
      AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter
    ) AS y);

你试过自己编码吗?因此,它不是一个代码编写服务。查找CHARINDEX()和PATINDEX()函数,付出努力,然后回来。如果您在某个地方遇到困难,我们将很乐意提供帮助,只要我们中的一些人继续编写代码,以帮助那些表现出零研究努力的人,我上面的评论是meaningless@Raj但你甚至没有投票决定结束?你还希望如何阻止其他人享受解决查询问题的乐趣,而不管OP之前是否做了足够的研究来满足你?抱歉,我没有使用这种格式,它不适合我。@gourishankar:输出显示了一个中间步骤,以帮助解释递归CTE正在做什么。查询的实际输出与您在问题中所希望的相同,您可以通过查看链接的演示看到这一点。为了清晰起见,我更新了这篇文章,并给出了一个最终输出的例子。@gourishankar你需要从人们在这里向你展示的东西中学习。它不是一种代码交付服务,而是人们教你如何解决问题的一种方式。你不能只是说“这种格式不合适”…@Aaron Bertrand先生,我已经为我的目的制作了这种类型的函数,但我的问题不是这个,然后我说它…thanx
| ID |  SN | INDEX |                        TYPES | TYPE |
|----|-----|-------|------------------------------|------|
|  1 | 123 |     1 | XYZ,TEST,RJK,CDF,TTT,UMB,UVX |  ABC |
|  2 | 234 |     1 |  CDF,TTT,UMB,UVX,TTT,UMB,UVX |  RJK |
|  3 | 345 |     1 |  XYZ,TTT,UMB,UVX,TTT,UMB,UVX |  OID |
|  3 | 345 |     2 |      TTT,UMB,UVX,TTT,UMB,UVX |  XYZ |
|  3 | 345 |     3 |          UMB,UVX,TTT,UMB,UVX |  TTT |
|  3 | 345 |     4 |              UVX,TTT,UMB,UVX |  UMB |
|  3 | 345 |     5 |                  TTT,UMB,UVX |  UVX |
|  3 | 345 |     6 |                      UMB,UVX |  TTT |
|  3 | 345 |     7 |                          UVX |  UMB |
|  3 | 345 |     8 |                              |  UVX |
|  2 | 234 |     2 |      TTT,UMB,UVX,TTT,UMB,UVX |  CDF |
|  2 | 234 |     3 |          UMB,UVX,TTT,UMB,UVX |  TTT |
|  2 | 234 |     4 |              UVX,TTT,UMB,UVX |  UMB |
|  2 | 234 |     5 |                  TTT,UMB,UVX |  UVX |
|  2 | 234 |     6 |                      UMB,UVX |  TTT |
|  2 | 234 |     7 |                          UVX |  UMB |
|  2 | 234 |     8 |                              |  UVX |
|  1 | 123 |     2 |     TEST,RJK,CDF,TTT,UMB,UVX |  XYZ |
|  1 | 123 |     3 |          RJK,CDF,TTT,UMB,UVX | TEST |
|  1 | 123 |     4 |              CDF,TTT,UMB,UVX |  RJK |
|  1 | 123 |     5 |                  TTT,UMB,UVX |  CDF |
|  1 | 123 |     6 |                      UMB,UVX |  TTT |
|  1 | 123 |     7 |                          UVX |  UMB |
|  1 | 123 |     8 |                              |  UVX |
| ID |  SN | TYPES1 | TYPES2 | TYPES3 | TYPES4 | TYPES5 | TYPES6 | TYPES7 | TYPES8 |
|----|-----|--------|--------|--------|--------|--------|--------|--------|--------|
|  1 | 123 |    ABC |    XYZ |   TEST |    RJK |    CDF |    TTT |    UMB |    UVX |
|  2 | 234 |    RJK |    CDF |    TTT |    UMB |    UVX |    TTT |    UMB |    UVX |
|  3 | 345 |    OID |    XYZ |    TTT |    UMB |    UVX |    TTT |    UMB |    UVX |
CREATE FUNCTION [dbo].[SplitStrings_Ordered]
(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT [Index] = ROW_NUMBER() OVER (ORDER BY Number), Item 
    FROM (SELECT Number, Item = SUBSTRING(@List, Number, 
      CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)
     FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
      FROM sys.all_objects) AS n(Number)
      WHERE Number <= CONVERT(INT, LEN(@List))
      AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter
    ) AS y);
DECLARE @d TABLE(ID INT, SN INT, Types NVARCHAR(MAX));

INSERT @d VALUES
(1,123,N'ABC,XYZ,TEST, RJK,CDF,TTT,UMB,UVX'),
(2,234,N'RJK,CDF,TTT,UMB,UVX,TTT,UMB,UVX'  ),
(3,345,N'OID,XYZ,TTT,UMB,UVX,TTT,UMB,UVX'  );

SELECT ID,SN,
 Types1 = [1], Types2 = [2], Types3 = [3], Types4 = [4],
 Types1 = [5], Types6 = [6], Types7 = [7], Types8 = [8]
FROM @d AS d CROSS APPLY dbo.SplitStrings_Ordered(d.Types, ',') AS y
PIVOT (MAX(Item) FOR [Index] IN ([1],[2],[3],[4],[5],[6],[7],[8])) AS p;