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)是怎么说的。