SQL2005學習筆記 APPLY 運算符
更新時間:2009年07月19日 01:49:49 作者:
APPLY 運算符簡介: APPLY 運算符是Sql Server2005新增加的運算符。
使用APPLY運算符可以為實現(xiàn)查詢操作的外部表表達式返回的每個行調用表值函數(shù)。
表值函數(shù)作為右輸入,外部表表達式作為左輸入。
通過對右輸入求值來獲得左輸入每一行的計算結果,生成的行被組合起來作為最終輸出。
APPLY運算符生成的列的列表是左輸入中的列集,后跟右輸入返回的列的列表。
APPLY 運算符的左操作數(shù)和右操作數(shù)都是表表達式。
這些操作數(shù)之間的主要區(qū)別是:右操作數(shù)可以使用表值函數(shù),從左操作數(shù)獲取一個列作為函數(shù)的參數(shù)之一。左操作數(shù)可以包括表值函數(shù),但不能以來自右操作數(shù)的列作為參數(shù)。
演示一下APPLY 運算符的用法:
--建一個表
CREATE TABLE MyData
(
ids INT IDENTITY PRIMARY KEY,
Data NVARCHAR(1000)
)
go
--插入測試數(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
--查詢結果
ids Data
1
2 a,b,c
3 q
4 i,p
建立一個表,作用是:按逗號分解字符,分解出的每一個字符做一行數(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 --字符長度為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
開始使用APPLY 運算符:
SELECT m.ids, f.*
FROM MyData m CROSS APPLY fun_MyData(data) f
go
--結果
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
--結果
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返回的結果行比CROSS APPLY多。
這一點有點象inner join(內部聯(lián)接)和Left Outer Join(左外部聯(lián)接)之間的關系.
其實APPLY有兩種形式:CROSS APPLY 和 OUTER APPLY。
CROSS APPLY僅返回外部表中通過表值函數(shù)生成結果集的行。
OUTER APPLY既返回生成結果集的行,也返回不生成結果集的行,其中表值函數(shù)生成的列中的值為 NULL。
以上是sql2005的解決方案,下面我演示一下sql2000怎么解決這樣的查詢:
思路是:做個循環(huán)來逐個鏈接查詢。
--sql2000版本
declare @ids int
select @ids =0
declare @data nvarchar(200)
select @data=''
--定義表變量臨時存放數(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
同樣得到了結果,但是sql2000要利用循環(huán),這樣代碼復雜,計算耗時。
讓我們充分利用Sql Server2005新兵器:APPLY運算符給我們帶來的簡便快捷的運算方式吧.
表值函數(shù)作為右輸入,外部表表達式作為左輸入。
通過對右輸入求值來獲得左輸入每一行的計算結果,生成的行被組合起來作為最終輸出。
APPLY運算符生成的列的列表是左輸入中的列集,后跟右輸入返回的列的列表。
APPLY 運算符的左操作數(shù)和右操作數(shù)都是表表達式。
這些操作數(shù)之間的主要區(qū)別是:右操作數(shù)可以使用表值函數(shù),從左操作數(shù)獲取一個列作為函數(shù)的參數(shù)之一。左操作數(shù)可以包括表值函數(shù),但不能以來自右操作數(shù)的列作為參數(shù)。
演示一下APPLY 運算符的用法:
復制代碼 代碼如下:
--建一個表
CREATE TABLE MyData
(
ids INT IDENTITY PRIMARY KEY,
Data NVARCHAR(1000)
)
go
--插入測試數(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
--查詢結果
ids Data
1
2 a,b,c
3 q
4 i,p
建立一個表,作用是:按逗號分解字符,分解出的每一個字符做一行數(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 --字符長度為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
開始使用APPLY 運算符:
復制代碼 代碼如下:
SELECT m.ids, f.*
FROM MyData m CROSS APPLY fun_MyData(data) f
go
--結果
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
--結果
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返回的結果行比CROSS APPLY多。
這一點有點象inner join(內部聯(lián)接)和Left Outer Join(左外部聯(lián)接)之間的關系.
其實APPLY有兩種形式:CROSS APPLY 和 OUTER APPLY。
CROSS APPLY僅返回外部表中通過表值函數(shù)生成結果集的行。
OUTER APPLY既返回生成結果集的行,也返回不生成結果集的行,其中表值函數(shù)生成的列中的值為 NULL。
以上是sql2005的解決方案,下面我演示一下sql2000怎么解決這樣的查詢:
思路是:做個循環(huán)來逐個鏈接查詢。
復制代碼 代碼如下:
--sql2000版本
declare @ids int
select @ids =0
declare @data nvarchar(200)
select @data=''
--定義表變量臨時存放數(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
同樣得到了結果,但是sql2000要利用循環(huán),這樣代碼復雜,計算耗時。
讓我們充分利用Sql Server2005新兵器:APPLY運算符給我們帶來的簡便快捷的運算方式吧.
相關文章
Win2008中安裝的MSSQL2005后無法訪問的解決方法
最近筆者一直在使用Win2008系統(tǒng),不過發(fā)現(xiàn)一個很奇怪的問題,那就是在該系統(tǒng)上安裝了SQL2005后,再在其他計算機訪問該主機顯示不能訪問2014-07-07SQLSERVER 2005中使用sql語句對xml文件和其數(shù)據(jù)的進行操作(很全面)
由于數(shù)據(jù)庫對xml數(shù)據(jù)直接處理有很多優(yōu)勢,05也對這方面加強了功能。下面是一些實例代碼,大家可以參考下。2010-06-06使用SQLSERVER 2005/2008 遞歸CTE查詢樹型結構的方法
我們經常遇到樹型結構,把它們顯示在一個類似TreeView控件上的情況。這時我們可以使用Recursive Common Table Expressions(CTE)實現(xiàn)2011-10-10Sql server 備份還原后出現(xiàn) 受限制用戶 問題
怎么解決Sql Server 2005數(shù)據(jù)庫備份還原后出現(xiàn)“受限制用戶”,這是大家在數(shù)據(jù)庫備份還原后經常遇到的問題,我們今天就來探討下.2020-03-03讓sql2005運行在獨立用戶下出現(xiàn) WMI 提供程序錯誤的解決方式
您還有 %1 的時間注銷,如果您 在此時間到之后仍沒有注銷,您的會話 將會斷開,任何打開的文件或設備 就可能丟失數(shù)據(jù)2012-11-11sqlserver 存儲過程中的top+變量使用分析(downmoon)
sqlserver 存儲過程中的top+變量使用分析(downmoon) ,需要的朋友可以參考下。2011-05-05sqlserver2005 master與msdb數(shù)據(jù)庫備份恢復過程
master與msdb數(shù)據(jù)庫的備份與普通數(shù)據(jù)庫一樣,恢復master與msdb數(shù)據(jù)庫關鍵在于以單用戶模式啟動,其它并沒有太大的區(qū)別,下面詳細說明使用方法2014-01-01sql2005數(shù)據(jù)導出方法(使用存儲過程導出數(shù)據(jù)為腳本)
在數(shù)據(jù)庫中使用下面的腳本創(chuàng)建存儲過程,然后執(zhí)行存儲過程,參數(shù)為表名,就可以把表的數(shù)據(jù)輸出為SQL腳本2014-01-01