SQL:解析具有三个分隔符的关联输入字符串
我可以使用光标来实现这一点,但如果可能的话,我会尽量避免。下面是我已经准备好的一些示例代码:SQL:解析具有三个分隔符的关联输入字符串,sql,sql-server-2008,Sql,Sql Server 2008,我可以使用光标来实现这一点,但如果可能的话,我会尽量避免。下面是我已经准备好的一些示例代码: declare @string varchar(max) = 'person1:item1~item2~item3~etc^person2:item1~item2~item3~etc' declare @table1 table (id int, value varchar(500)) declare @table2 table (id varchar(50), value varchar(500))
declare @string varchar(max) = 'person1:item1~item2~item3~etc^person2:item1~item2~item3~etc'
declare @table1 table (id int, value varchar(500))
declare @table2 table (id varchar(50), value varchar(500))
declare @table3 table (id varchar(50), value varchar(50))
insert @table1 (id, value) select * from fn_ParseDelimitedStrings(@string, '^')
insert @table2 (id, value)
select
id = (select f.value from fn_ParseDelimitedStrings(t.value, ':') f where f.RowId=1),
value = (select f.value from fn_ParseDelimitedStrings(t.value, ':') f where f.RowId=2)
from @table1 t
select * from @table2
上述代码以以下形式提供数据:
id value
-------------------------------
person1 item1~item2~item3~etc
person2 item1~item2~item3~etc
但我需要以下表格中的数据:
id value
-------------------------------
person1 item1
person1 item2
person1 item3
person1 etc
person2 item1
person2 item2
person2 item3
person3 etc
输入字符串可以有任意数量的“人”,每个人可以有任意数量的“项目”
fn_ParseDelimitedStrings是一个自定义函数,用于返回每个分隔项的索引值对表。即:
RowID Value
-------------
1 item1
2 item2
3 item3
4 etc
我很难将最终拆分中的每个“项目”关联到它们应该关联的“人”
有什么可以做的吗?或者我必须使用游标吗?将当前行与外部应用中派生表中的所有行连接起来:
insert @table2 (id, value)
select
id = (select f.value from fn_ParseDelimitedStrings(t.value, ':') f where f.RowId=1),
value = v1.value
from @table1 t
outer apply
(
select v.value
from fn_ParseDelimitedStrings(
(select f.value
from fn_ParseDelimitedStrings(t.value, ':') f
where f.RowId=2)
, '~') v
) v1
*编辑值1到v1以匹配最外层选择查看此帖子。如果你关心表现,看看亚伦·伯特兰(Aaron Bertrand)是怎么说的。