SQL Server 2000 不支援 ROW_NUMBER() 等現代分頁函數。常見替代方案是 SELECT ... INTO #temp 搭配 IDENTITY() 產生行號,但若來源表含識別欄位會報錯:無法使用 SELECT INTO 將識別欄位添加到表...。本文提供兩種通用解法,無需指定欄位清單。
SELECT *, IDENTITY(INT,1,1) AS RowNumber INTO #temp FROM Article;
-- 若 Article 含 IDENTITY 欄位 → 報錯
SELECT *, IDENTITY(INT,1,1) AS RowNumber
INTO #temp
FROM (SELECT * FROM Article) AS newArticle;
外層查詢不直接繼承來源表的識別屬性,避免衝突。
SELECT T1.*, IDENTITY(INT,1,1) AS RowNumber
INTO #temp
FROM Article AS T1 JOIN Article AS T2 ON 1=2;
ON 1=2 確保無資料列回傳,僅取得結構描述,同樣避開識別欄位繼承。
INSERT INTO #temp EXEC ('SELECT * FROM Product');
可將動態構建的查詢結果導入已建立行號的臨時表,再進行分頁處理。
-- 1. 建立帶行號臨時表
SELECT *, IDENTITY(INT,1,1) AS RowNumber INTO #temp
FROM (SELECT * FROM Article) AS t;
-- 2. 計算分頁範圍
DECLARE @PageSize INT = 20, @PageNum INT = 3;
DECLARE @StartRow INT = (@PageNum - 1) * @PageSize + 1;
DECLARE @EndRow INT = @PageNum * @PageSize;
-- 3. 取得目標頁資料
SELECT * FROM #temp WHERE RowNumber BETWEEN @StartRow AND @EndRow;
-- 4. 清理
DROP TABLE #temp;
#temp) 為 Session 級,連線關閉自動清理ROW_NUMBER() 或 OFFSET/FETCH