我尝试如下所示的实例查询将逗号分隔列表转换为多个记录,我发现cte表'tmp'可以独立运行,直到所有子字符串都加载到新记录中。此示例查询来自此thread。
我不想专注于这个功能,而是在这里使用临时表。任何人都可以建议在T-SQL中使用什么术语来描述cte表的这种计算技术? cte表在定义语句中自行调用,没有显式循环语句,表实际上迭代运行,直到过滤器语句where Data > ''
返回NULL。
create table Testdata(SomeID int, OtherID int, Data varchar(max))
insert Testdata select 1, 9, '18,20,22,25,26'
insert Testdata select 2, 8, '17,19'
insert Testdata select 3, 7, '13,19,20'
insert Testdata select 4, 6, ''
;with tmp(SomeID, OtherID, DataItem, Data) as (
select SomeID, OtherID, LEFT(Data, CHARINDEX(',',Data+',')-1),
STUFF(Data, 1, CHARINDEX(',',Data+','), '')
from Testdata
union all
select SomeID, OtherID, LEFT(Data, CHARINDEX(',',Data+',')-1),
STUFF(Data, 1, CHARINDEX(',',Data+','), '')
from tmp
where Data > ''
)
select SomeID, OtherID, DataItem
from tmp
order by SomeID
答案 0 :(得分:1)
你是对的,术语是递归公用表表达式,AKA rCTE。请参阅:https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx
有几点需要注意: 首先,对于T-SQL中的大多数事情,rCTE很慢并且会产生大量IO。对于分割(AKA标记化)分隔字符串,它们是一个糟糕的选择。 rCTE适用于处理分层数据,这就是为什么,如果您在Google上搜索递归CTE,最常见的示例将是如何遍历分层员工表等。
关于rCTE及其有益的文章可以在这里找到:http://www.sqlservercentral.com/articles/T-SQL/90955/
答案 1 :(得分:0)
经过快速研究后,我找到了一个术语“递归公用表格表达式”,它应该适合这个主题。任何其他建议都非常受欢迎。