在SQL Server2005中有一個ROW_NUMBER函數,它將針對SELECT語句返回的每一行,從1開始編號,賦予其連續的編號。在查詢時應用了一個排序標準後,只有通過編號才能夠保證其順序是一致的,當使用ROW_NUMBER函數時,也需要專門一列用於預先排序以便於進行編號。
以北風資料庫為例,代碼如下:
SELECT ROW_NUMBER() OVER (ORDER BY ProductID) AS ROW,ProductName FROM Products
啟動並執行結果如下:
ROW ProductName
--------------------- ----------------------------------------
1 Chai
2 Chang
3 Aniseed Syrup
4 Chef Anton's Cajun Seasoning
5 Chef Anton's Gumbo Mix
6 Grandma's Boysenberry Spread
如果要取出表中2-5個產品名稱,把上面的查詢變為子查詢,並在主查詢的WHERE子句過濾查詢的結果,上面的子查詢當作一個獨立的表,以在主查詢使用(在子查詢後面的AS關鍵字,是用來給這個虛擬“表”指定一個建立的名稱)SELECT ROW,ProductName
FROM(SELECT ROW_NUMBER() OVER (ORDER BY ProductID) AS ROW,ProductName FROM Products)
AS ProductsWithRowNumbers WHERE Row >=2 AND Row<=5啟動並執行結果如下:
ROW ProductName
--------------------- ----------------------------------------
2 Chang
3 Aniseed Syrup
4 Chef Anton's Cajun Seasoning
5 Chef Anton's Gumbo Mix
使用表變數
如果需要對取回的資料集進行進一步操作,就可能需要儲存它,儲存在一個TABEL變數中,在一個預存程序中表變數常用來存放臨時資料。TABLE表變數可以作為正常表來使用。
以北風資料庫為例,代碼如下: CREATE PROCEDURE MyTable
AS
DECLARE @MyProducts table
(MyROW int,
MyProductID int,
MyProductName varchar(40))
BEGIN
INSERT INTO @MyProducts
SELECT ROW_NUMBER() OVER (ORDER BY ProductID) AS ROW,ProductID,ProductName FROM Products
SELECT MyROW,MyProductName FROM @MyProducts WHERE MyROW >=2 AND MyROW<=5
END
GO啟動並執行結果如下:
MyROW MyProductName
----------- ----------------------------------------
2 Chang
3 Aniseed Syrup
4 Chef Anton's Cajun Seasoning
5 Chef Anton's Gumbo Mix
使用暫存資料表
如果需要對取回的資料集進行進一步操作,就可能需要儲存它,儲存在暫存資料表中,在一個預存程序中暫存資料表常用來存放臨時資料。暫存資料表可以作為正常表來使用。
以北風資料庫為例,代碼如下:CREATE PROCEDURE [dbo].[MyTable]
AS
CREATE TABLE #MyProducts
(MyROW int,
MyProductID int,
MyProductName varchar(40))
BEGIN
INSERT INTO #MyProducts
SELECT ROW_NUMBER() OVER (ORDER BY ProductID) AS ROW,ProductID,ProductName FROM Products
SELECT MyROW,MyProductName FROM #MyProducts WHERE MyROW >=2 AND MyROW<=5
END 啟動並執行結果如下:
MyROW MyProductName
----------- ----------------------------------------
2 Chang
3 Aniseed Syrup
4 Chef Anton's Cajun Seasoning
5 Chef Anton's Gumbo Mix