Apply是SQL Server 2005引入的一個新操作符,具有如下的基本語法:
select *
from tableA apply table_func(...)
Apply左邊表的每一行輸入右邊的函數,該函數根據輸入返回一個表,最後輸入表的每一行與表結合起來,形成了結果集。
有必要解釋下表值函數,它是返回值爲一個表的函數,請參考MSDN的相關文檔。
現在先看看我們要解決的問題:
如果我們有一張表LocationLog,具有列Locations,內容示例如下:
JiangSu;BeiJing;Shanghai;
FuJian;ShanDong;JiangSu;
...
現在希望統計出各個省份出現的次數。
我們假設已經有這樣一個函數,如後面附錄所示,它能夠將輸入的一個長字符串分離成幾個短字符串,如輸入JiangSu;BeiJing;ShangHai,輸出應該是:
1 JiangSu
2 BeiJing
3 ShangHa
該函數名字是splitString。使用Apply,我們可以這樣解決問題:
select subStr,count(*)
from LocationLog cross apply dbo.splitString(locationRecord)
group by subStr
結果如下:
BeiJing 1
FuJian 1
JiangSu 2
ShanDong 1
Shanghai 1
爲了方便讀者,我也寫出splitString的簡單實現。
CREATE FUNCTION dbo.splitString
(
@strs nvarchar(1024),
@ch nchar = ';'
)
RETURNS @tmp TABLE
(
strId int identity(1,1),
subStr nvarchar(1024)
)
AS
begin
declare @pos int, @posX int
set @pos = 1
while( @pos < len(@strs) )
begin
set @posX = charindex(@ch,@strs,@pos)
if( @posX = 0) set @posX = len(@strs) + 1
insert into @tmp (subStr) values(substring(@strs,@pos,@posX-@pos))
set @pos = @posX+1
end
RETURN
end
GO