SQL2005學(xué)習(xí)筆記 APPLY 運(yùn)算符
表值函數(shù)作為右輸入,外部表表達(dá)式作為左輸入。
通過(guò)對(duì)右輸入求值來(lái)獲得左輸入每一行的計(jì)算結(jié)果,生成的行被組合起來(lái)作為最終輸出。
APPLY運(yùn)算符生成的列的列表是左輸入中的列集,后跟右輸入返回的列的列表。
APPLY 運(yùn)算符的左操作數(shù)和右操作數(shù)都是表表達(dá)式。
這些操作數(shù)之間的主要區(qū)別是:右操作數(shù)可以使用表值函數(shù),從左操作數(shù)獲取一個(gè)列作為函數(shù)的參數(shù)之一。左操作數(shù)可以包括表值函數(shù),但不能以來(lái)自右操作數(shù)的列作為參數(shù)。
演示一下APPLY 運(yùn)算符的用法:
--建一個(gè)表
CREATE TABLE MyData
(
ids INT IDENTITY PRIMARY KEY,
Data NVARCHAR(1000)
)
go
--插入測(cè)試數(shù)據(jù)
INSERT INTO MyData VALUES('')
INSERT INTO MyData VALUES('a,b,c')
INSERT INTO MyData VALUES('q')
INSERT INTO MyData VALUES('i,p')
GO
select * from MyData
go
--查詢結(jié)果
ids Data
1
2 a,b,c
3 q
4 i,p
建立一個(gè)表,作用是:按逗號(hào)分解字符,分解出的每一個(gè)字符做一行數(shù)據(jù)返回
create FUNCTION fun_MyData(
@data AS NVARCHAR(1000)
)
RETURNS @tem TABLE( id INT , value nvarchar(100) )
AS
BEGIN
select @data=isnull(@data,'')
if len(@data)=0
return --字符長(zhǎng)度為0 ,退出
declare @id AS INT
select @id=1
declare @end AS INT
select @end = CHARINDEX(',', @data)
while(@end>0)
begin
insert into @tem(id,value)
select @id,left(@data,@end-1)
select @id=@id+1
select @data=right(@data,len(@data)-@end)
select @end = CHARINDEX(',', @data)
end
if len(@data)>0
begin
insert into @tem(id,value)
select @id,@data
end
RETURN
END
開(kāi)始使用APPLY 運(yùn)算符:
SELECT m.ids, f.*
FROM MyData m CROSS APPLY fun_MyData(data) f
go
--結(jié)果
ids id value
2 1 a
2 2 b
2 3 c
3 1 q
4 1 i
4 2 p
SELECT m.ids, f.*
FROM MyData m OUTER APPLY fun_MyData(data) f
go
--結(jié)果
ids id value
1 NULL NULL
2 1 a
2 2 b
2 3 c
3 1 q
4 1 i
4 2 p
我們看到OUTER APPLY返回的結(jié)果行比CROSS APPLY多。
這一點(diǎn)有點(diǎn)象inner join(內(nèi)部聯(lián)接)和Left Outer Join(左外部聯(lián)接)之間的關(guān)系.
其實(shí)APPLY有兩種形式:CROSS APPLY 和 OUTER APPLY。
CROSS APPLY僅返回外部表中通過(guò)表值函數(shù)生成結(jié)果集的行。
OUTER APPLY既返回生成結(jié)果集的行,也返回不生成結(jié)果集的行,其中表值函數(shù)生成的列中的值為 NULL。
以上是sql2005的解決方案,下面我演示一下sql2000怎么解決這樣的查詢:
思路是:做個(gè)循環(huán)來(lái)逐個(gè)鏈接查詢。
--sql2000版本
declare @ids int
select @ids =0
declare @data nvarchar(200)
select @data=''
--定義表變量臨時(shí)存放數(shù)據(jù)
declare @tem table(
ids int,
id int,
value nvarchar(100)
)
DECLARE test_cursor CURSOR FOR
SELECT ids, Data FROM MyData
OPEN test_cursor
FETCH NEXT FROM test_cursor
INTO @ids,@data
WHILE @@FETCH_STATUS = 0
begin
insert into @tem
select @ids,id,value
from dbo.fun_MyData(@data)
FETCH NEXT FROM test_cursor
INTO @ids,@data
end
CLOSE test_cursor
DEALLOCATE test_cursor
select * from @tem
同樣得到了結(jié)果,但是sql2000要利用循環(huán),這樣代碼復(fù)雜,計(jì)算耗時(shí)。
讓我們充分利用Sql Server2005新兵器:APPLY運(yùn)算符給我們帶來(lái)的簡(jiǎn)便快捷的運(yùn)算方式吧.
相關(guān)文章
sql 2005不允許進(jìn)行遠(yuǎn)程連接可能會(huì)導(dǎo)致此失敗的解決方法
用vs.net2005連接sql server 2005 出現(xiàn)以下錯(cuò)誤:在建立與服務(wù)器的連接時(shí)出錯(cuò)。在連接到 SQL Server 2005 時(shí),在默認(rèn)的設(shè)置下 SQL Server 不允許進(jìn)行遠(yuǎn)程連接可能會(huì)導(dǎo)致此失敗。2008-04-04
SQL Server 2005通用分頁(yè)存儲(chǔ)過(guò)程及多表聯(lián)接應(yīng)用
分頁(yè)存儲(chǔ)過(guò)程在好多文章中都有介紹過(guò);本篇是不久前寫(xiě)的一個(gè)分頁(yè)存儲(chǔ)過(guò)程,可應(yīng)用于SQL Server 2005上面,感興趣的朋友可以研究下,希望本文對(duì)你學(xué)習(xí)存儲(chǔ)過(guò)程有所幫助2013-01-01
SQLServer2005 Output子句獲取剛插入的ID值
SQLServer2005的Output子句獲取剛插入的ID值2009-08-08
SQL Server 2005“備份集中的數(shù)據(jù)庫(kù)備份與現(xiàn)有的數(shù)據(jù)庫(kù)不同”解決方法
SQL Server 2005“備份集中的數(shù)據(jù)庫(kù)備份與現(xiàn)有的數(shù)據(jù)庫(kù)不同”解決方法2009-07-07
SQL 2005使用專(zhuān)用管理員連接(DAC)的技巧及修改系統(tǒng)表的方法
SQL Server 2005 為管理員提供了一種特殊的診斷連接,以供在無(wú)法與服務(wù)器建立標(biāo)準(zhǔn)連接時(shí)使用。2011-07-07
快速將珊瑚蟲(chóng)IP數(shù)據(jù)庫(kù)轉(zhuǎn)MS SQL2005的圖文教程
在幻想曲BLOG上看到不少朋友說(shuō),最近服務(wù)器上的IP數(shù)據(jù)好像不是很準(zhǔn)確,于是重新做了一個(gè)新的,不少朋友可能需要這個(gè)數(shù)據(jù)庫(kù),因?yàn)槲募蟮木壒?,所以直接提供快速轉(zhuǎn)換方法。2008-08-08
SqlServer 2005 中字符函數(shù)的應(yīng)用
SqlServer 2005 中字符函數(shù)的應(yīng)用,需要的朋友可以參考下。2010-07-07
SQLServer2005 XML數(shù)據(jù)操作代碼
在項(xiàng)目中經(jīng)常用XML文件,看看T-SQL程序設(shè)計(jì)發(fā)現(xiàn)SQLSERVER2005居然可以處理XML類(lèi)型,而且還可以使用類(lèi)似于Xpath的查詢語(yǔ)法查詢。2010-06-06
sqlserver2005 TSql新功能學(xué)習(xí)總結(jié)(數(shù)據(jù)類(lèi)型篇)
sql server2005 TSql新功能學(xué)習(xí)總結(jié)(數(shù)據(jù)類(lèi)型篇) ,希望對(duì)需要的朋友有所幫助。2010-07-07
MSSQL2005數(shù)據(jù)庫(kù)備份導(dǎo)入MSSQL2000
需要將數(shù)據(jù)從mssql2005轉(zhuǎn)到mssql2000,因?yàn)榘l(fā)現(xiàn)sql2005用起來(lái)并不舒服直接restore或附加應(yīng)該是不行的, 用腳本+導(dǎo)數(shù)據(jù)肯定沒(méi)有問(wèn)題。2008-05-05

