Sql server 使用逗号分隔符将单行转换为多列

Sql server 使用逗号分隔符将单行转换为多列,sql-server,string,csv,join,sql-server-2012,Sql Server,String,Csv,Join,Sql Server 2012,如果我发布 SELECT ID FROM TestAhmet 我得到这个结果: 1,2,3,4,5 但我真正需要的是多列,所有值用逗号分隔,如下所示: 1 3 5 2 4 如何执行此操作?如果您运行的是SQL Server 2016或更高版本,则可以使用: 您可以将此查询作为一个函数,并在多个进程中使用它 DECLARE @list varchar(MAX)= '1,2,3,4,5', @pos int, @nextpos int,

如果我发布

SELECT ID FROM TestAhmet 
我得到这个结果:

1,2,3,4,5
但我真正需要的是多列,所有值用逗号分隔,如下所示:

1
3
5
2
4

如何执行此操作?

如果您运行的是SQL Server 2016或更高版本,则可以使用:


您可以将此查询作为一个函数,并在多个进程中使用它

DECLARE @list varchar(MAX)= '1,2,3,4,5',
        @pos        int,
        @nextpos    int,
        @valuelen   int
DECLARE  @tbl TABLE (number int  NULL)

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END

   SELECT * FROM @tbl

您可以使用SQL Server 2012上提供的与XML相关的函数

参考:及

DECLARE@text\u to\u split nvarchar(100)='1,10,4,6'
选择document.node.value('.','int')作为id
从…起
(选择CAST(“”+替换(@text_to_split,“,”)+“”作为XML)作为内容)XML_数据
交叉应用xml_data.content.nodes('/content/x')作为文档(node)
输出为:

1
10
4
6
解释 我们要做的是将数据转换为有效的XML:

CAST('<content><x>' + REPLACE(@text_to_split, ',', '</x><x>') + '</x></content>' AS XML) as content
最后,我们提取XML节点的内容并将其转换为整数

SELECT document.node.value('.', 'int') as id

如果可能的话,我建议首先将表更改为不存储逗号分隔的值。而是将这些值放在一个单独的表中,该表与TestAhmet表具有多对一关系。您想在服务器端还是客户端实现这一点?Hi Guru,服务器端。@Subash首先不存储这些值。这是一只虫子。在主流支持(2016+)的所有SQL Server版本中,您可以使用
STRING\u SPLIT
。你也会发现很多类似的SO问题。XML路径技术可能是最快的。任何版本的最佳选择都是在服务器上拆分数据,并将其存储在单独的表中,存储在多行上,就像任何其他数据一样。另一个选择是将数据存储为XML并使用XML方法进行查询。嗨,GMB,谢谢你的更新,祝你好运,我正在使用sql 2012。请给出该版本的解决方案。@Subash SO不是免费的代码编写服务。拆分字符串一直是(而且可能会继续是)一个不变的话题;只要稍加搜索,就会找到许多代码示例,这些示例可以在任何版本的sql server上实现这一点。@Subash我已经编辑了您的问题,添加了sql 2012标记,因此它更准确answers@Subash在2012年,您可以使用replace来形成XML节点和与XML相关的函数
CROSS APPLY xml_data.content.nodes('/content/x') as document(node)
SELECT document.node.value('.', 'int') as id