2011-09-29 39 views
3

我有一個表值函數,基本上是一個拆分類型的函數,每個數據字符串最多返回4行。T-SQL - 十字架適用於PIVOT? (使用與表值函數的樞軸)?

於是我運行:

select * from dbo.split('a','1,a15,b20,c40;2,a25,d30;3,e50') 

我得到:

Seq Data 
1 15 
2 25 

然而,我的最終數據需要像

15 25 

所以我做一個支點。如預期

select [1],[2],[3],[4] 
from dbo.split('a','1,a15,b20,c40;2,a25,d30;3,e50') 
pivot (max(data) for seq in ([1],[2],[3],[4])) 
as pivottable 

它的工作原理:

1 2 
--- --- 
15 25 

然而,一行是偉大的。我現在需要一次完成數百條記錄。我的想法是做一個交叉應用,但不知道如何組合一個交叉應用和一個樞軸。

(是的,很明顯,簡單的答案是寫一個修改版本,返回4列,但是這不是出於其他原因的最佳選擇)

任何幫助極大的讚賞。

而我這麼做的原因是:當前查詢使用SPLIT的標量值版本,在同一個SELECT(對於數據字符串爲500+字節)的同一SELECT內調用12次。

據我所知,這將需要它掃描相同的500字節* 1000000行,12次。

+0

在表中的字段,我這樣做的原因是:由於邏輯在dbo.SPLIT量(這是什麼上面是一個激​​烈的簡單化) ,我試圖避免運行SPLIT的標量值函數版本,它看起來像'select dbo.split('a',1,'1,a15,b20,c40; 2,a25,d30; 3,e50 ''),被稱爲12次(「a」,「1」,「a」,「2」,「a」,「3」,「a」,「4」,「c」,1 「」'C'2" ,...),.當對一張有一百萬行的桌子進行查詢時,它就是一件壞事。 – mbourgon

+0

我想我不理解的東西......你需要用新參數調用函數,所以CROSS APPLY不會幫助你。參數如何首先傳遞給函數?你能否概括介紹所涉及的過程? – Wil

+0

而不是使用參數,我想從表中給它一個字段。當前進程基本上看起來像'select a,b,dbo.splitscalar('a',1,stringofdata),dbo.splitscalar('a',2,stringofdata),dbo.splitscalar('b',1,stringofdata) ...(總共12次),並且由於字符串是幾百個字節,所以我改變爲CROSS APPLY並且調用3次函數可能會更快。 – mbourgon

回答

2

這就是你如何使用交叉應用。假設table1是你的桌子和Line是要拆分

SELECT * fROM table1 as a 
    cross apply dbo.split(a.Line) as b 
    pivot (max(data) for seq in ([1],[2],[3],[4])) as p