【发布时间】:2011-06-17 05:10:27
【问题描述】:
我有一张看起来像的桌子
ID Layout
1 hello,world,welcome,to,tsql
2 welcome,to,stackoverflow
期望的输出应该是
Id Splitdata
1 hello
1 world
1 welcome
1 to
1 tsql
2 welcome
2 to
2 stackoverflow
我已通过以下查询完成此操作
Declare @t TABLE(
ID INT IDENTITY PRIMARY KEY,
Layout VARCHAR(MAX)
)
INSERT INTO @t(Layout)
SELECT 'hello,world,welcome,to,tsql' union all
SELECT 'welcome,to,stackoverflow'
--SELECT * FROM @t
;With cte AS(
select F1.id
,O.splitdata
from
(
select *,
cast('<X>'+replace(F.Layout,',','</X><X>')+'</X>' as XML) as xmlfilter
from @t F
)F1
cross apply
(
select fdata.D.value('.','varchar(MAX)') as splitdata
from f1.xmlfilter.nodes('X') as fdata(D)) O
)
select * from cte
但是从性能上来说它是非常糟糕的。我正在寻找更有效的查询,但仅使用 CTE。
【问题讨论】:
-
尝试 [this post](wisesoft.co.uk/scripts/t-sql_cte_split_string_function.aspx) 中的 proc,他们使用递归进行拆分。我认为你可以适应它。这使用 CTE。
-
@Joel 虽然我同意你的观点,但有时有充分的理由知道如何有效地做到这一点。专门清理来自集成系统的不良数据,您必须定期将例程作为作业运行。我认为答案将对其他人具有启发性和帮助。
-
@NullRef - 同意,我的评论有些夸张。这就是为什么它是评论,而不是答案。但我也认为将通知放在适当的位置并为粗心的人投票也很重要。
-
@Joel 我对此无可争辩。我也无法与 CSV=666 争论!
-
使用 CTE 如何使 T-SQL 更擅长字符串解析?
标签: sql sql-server sql-server-2005 tsql common-table-expression