在處理完這個問題後,我偶然發現了遞歸CTE,它們在表面上似乎是一種解決「將表格行拆分爲csv」的相當簡單的方法。遞歸SQL將CSV拆分爲表格行
我把這個例子一起
DECLARE @InputString varchar(255) = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'
SELECT @InputString = @InputString + ','
;
with MyCTE(x,y)
as
(
SELECT
x = SUBSTRING(@InputString,0,PATINDEX('%,%',@InputString)),
y = SUBSTRING(@InputString,PATINDEX('%,%',@InputString)+1,LEN(@InputString))
UNION ALL
SELECT
x = SUBSTRING(y,0,PATINDEX('%,%',y)),
y = SUBSTRING(y,PATINDEX('%,%',y)+1,LEN(y))
FROM
MyCTE
WHERE
SUBSTRING(y,PATINDEX('%,%',y)+1,LEN(y)) <> '' OR
SUBSTRING(y,0,PATINDEX('%,%',y)) <> ''
)
SELECT x FROM MyCTE
OPTION (MAXRECURSION 2000);
GO
這真的是一個壞主意?對於像這樣的遞歸查詢,SQL的開銷是多少,以及這種方法的潛在缺陷是什麼。
順便說一句,我想這個想法/技術可能可以用來解決這個other問題。
有趣的是,我猜這個解決方案基本上是向前遞歸?是否有更通用的解決方案,不需要master..spt_values(即支持> 2047項)? – Runonthespot 2011-05-13 14:28:15
可能與ROW_NUMBER()有關? – Runonthespot 2011-05-13 14:28:31
你可以擁有自己的數字表,我顯示spt_values的原因是因爲每個SQL Server安裝都有它 – SQLMenace 2011-05-13 14:35:33