Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于将列拆分为其他列的SQL命令_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

用于将列拆分为其他列的SQL命令

用于将列拆分为其他列的SQL命令,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我试图在我的表中选取一列,该列有多个值,最多10个值由其中的管道|分隔,并将分隔的值添加到表中的其他列中。注释在SQL SVR 2014上运行 表 Col1 Col2 Col3 1 Tom 12345678|87654321|11111111|22222222|..... up to 10 2 Joe 14563467 3 Zac 12345678|87654321 我需要SQL的结果来生成 Col1 Col2 Col3

我试图在我的表中选取一列,该列有多个值,最多10个值由其中的管道|分隔,并将分隔的值添加到表中的其他列中。注释在SQL SVR 2014上运行

Col1   Col2   Col3
1      Tom    12345678|87654321|11111111|22222222|..... up to 10
2      Joe    14563467
3      Zac    12345678|87654321
我需要SQL的结果来生成

Col1   Col2   Col3      Col4      Col5      Col6      Col7   Col8   Col9 ....
1      Tom    12345678  87654321  11111111  22222222
2      Joe    14563467
3      Zac    12345678  87654321

感谢您的帮助

首先可以使用新的STRING_SPLIT函数将数据规范化为一个派生表,拆分列向下拉伸。使用该表,您可以基于Col1进行数据透视,创建5列,基本上是将先前拆分的数据向上拉。接下来,将该数据用作源,以便更新回源表

如果您不在SQL Server 2016上,则需要使用带分隔符的字符串解析器表值函数替换字符串_SPLIT

DECLARE @T TABLE(Col1 INT, Col2 NVARCHAR(50), Col3 NVARCHAR(50), Col4 NVARCHAR(50), Col5 NVARCHAR(50))

INSERT @T (COl1,Col2) VALUES (1,'12345678|87654321|11111111|22222222|')
INSERT @T (COl1,Col2) VALUES (2,'12345678')
INSERT @T (COl1,Col2) VALUES (3,'12345678|87654321|')

SELECT * FROM @T
;
WITH SplitData AS
(
    SELECT 
        Col1,Col2 = S.Value,
        RN = ROW_NUMBER()OVER( PARTITION BY Col1 ORDER BY (SELECT 1 AS X))
    FROM 
        @T
        CROSS APPLY STRING_SPLIT(Col2,'|') S
)
,UpdateData AS
(
    SELECT 
        Col1, Col2=[1], Col3=[2], Col4=[3], Col5=[4] 
    FROM  
    (
        SELECT Col1, Col2, RN FROM SplitData
    ) AS S  
    PIVOT(
        MAX(Col2) FOR RN IN ([1], [2], [3], [4], [5])
    ) AS P
)
UPDATE L 
SET L.Col1 = R.Col1, L.Col2=R.Col2, L.Col3=R.Col3, L.Col4=R.Col4, L.Col5 = R.Col5
FROM 
    @T L
    INNER JOIN UpdateData R ON L.Col1 = R.Col1

SELECT * FROM @T

如果您确定Col3中的最大值计数为10,则可以在Col3上使用带拆分字符串的交叉应用,并选择具有拆分值的列以及由col1和col2划分的行号。第二步是按行透视此表

可拆分为 选择Col1 ,Col2 价值 ,按Col1超额分配的行数,按Col2排序,选择NULL作为rn 从你的桌子上 交叉应用字符串_SPLITCol3,“|”作为YT 选择Col1 ,Col2 ,[1] ,[2] ,[3] ,[4] ,[5] ,[6] ,[7] ,[8] ,[9] ,[10] 从可拆分 支点 最大值 对于[1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]、[9]、[10]中的RN 作为PVT
我建议Ross已经回答了这个问题,我的团队在SQL server 2014上,对于这种情况,什么是好的分隔字符串解析器表值函数?您将得到许多示例,但是,我将搜索SQL server最有效的字符串拆分例程。有一些相当不错的文章,其中一些人花了很多时间比较算法。