Sql server SQL Server:将一列拆分为多列(表格格式)

Sql server SQL Server:将一列拆分为多列(表格格式),sql-server,split,Sql Server,Split,我有一张这样的桌子: id actions ua123 [{'type':'mobile'},{'action':'display conversion'}] ua234 [{'type':'DT'},{'action':'search'},{'value':'40'}] 此表之所以看起来像这样是因为信息是从网站抓取的。我想将actions列拆分为几个列,例如: id actions1 action2

我有一张这样的桌子:

id         actions
ua123      [{'type':'mobile'},{'action':'display conversion'}]
ua234      [{'type':'DT'},{'action':'search'},{'value':'40'}]
此表之所以看起来像这样是因为信息是从网站抓取的。我想将actions列拆分为几个列,例如:

id         actions1                    action2                         action3
ua123      [{'type':'mobile'}   {'action':'display conversion'}]        Null
ua234      [{'type':'DT'}       {'action':'search'}                {'value':'40'}]

请随意分享任何灯光。谢谢

假设您不需要动态。(如有需要,零钱)


@约翰卡佩莱蒂谢谢你的回答,这给了我一些启示

这是我用来解决问题的最后一个语法

Declare @delimiter varchar(50)
set @delimiter=' ';

With Test1 as 
(Select id,
        actions,
        cast('<x>'+replace(actions,@delimiter,'<x></x>')+'</x>' as XML)
        as Name_XML
 From tb1
)
Select id,
       actions,
       Name_XML.value('/x[1]','varchar(50)') as action1,
       Name_XML.value('/x[2]','varchar(50)') as action2,
       Name_XML.value('/x[3]','varchar(50)') as action3,
       Name_XML.value('/x[4]','varchar(50)') as action4,
         .
         .
         .
         .
From Test1
Declare@delimiter varchar(50)
设置@delimiter='';
将Test1作为
(选择id,
行动,
强制转换(''+replace(操作,@delimiter'')+''为XML)
as Name_XML
来自tb1
)
选择id,
行动,
将XML.value('/x[1]','varchar(50')命名为action1,
将XML.value('/x[2]','varchar(50')命名为action2,
将XML.value('/x[3]','varchar(50')命名为action3,
将XML.value('/x[4]','varchar(50')命名为action4,
.
.
.
.
从测试1开始

谢谢您的回答。然而,当我运行上面的代码时。消息显示“找不到数据类型‘XML’”。我找到的一个答案是,当我使用2016时,XML似乎在2005/2008 sql server下是兼容的。然而,当我将脚本版本更改回2005/2008时,它仍然不起作用。有什么想法吗?@ZedFang XML自2005年版起就可以使用了。我简直无法想象错误是从哪里来的。我再挖一点,听起来不错。不管怎样,您上面使用的解决方案只适用于原始列,它最多只有三个“,{”。但是,如果我不知道有多少个“,{'在每一行中,如何根据每一行本身自动将这些列分隔成若干列?我习惯于在postgresql下使用split_part,它将自动检测分隔符。我不相信sql server也有此功能。@ZedFang问题不清楚您是否需要动态。但是,只需要使用它可能更容易将交叉应用扩展为10。只需复制actions3行,并将等号两边的3更改为4。我知道为什么您的语法在前面不起作用。这是因为我的数据位于视图下。我相信您的语法可以适用于大多数SQL server情况。再次感谢
ID       actions1           actions2                            actions3
ua123   [{"type":"mobile"}  {"action":"display conversion"}]    NULL
ua234   [{"type":"DT"}      {"action":"search"}                {"value":"40"}]
Declare @delimiter varchar(50)
set @delimiter=' ';

With Test1 as 
(Select id,
        actions,
        cast('<x>'+replace(actions,@delimiter,'<x></x>')+'</x>' as XML)
        as Name_XML
 From tb1
)
Select id,
       actions,
       Name_XML.value('/x[1]','varchar(50)') as action1,
       Name_XML.value('/x[2]','varchar(50)') as action2,
       Name_XML.value('/x[3]','varchar(50)') as action3,
       Name_XML.value('/x[4]','varchar(50)') as action4,
         .
         .
         .
         .
From Test1