首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 分頁替代方案:IDENTITY + 臨時表技巧

     編輯:關於SqlServer

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;

外層查詢不直接繼承來源表的識別屬性,避免衝突。

解法二:自我 JOIN 條件永假

SELECT T1.*, IDENTITY(INT,1,1) AS RowNumber
INTO #temp
FROM Article AS T1 JOIN Article AS T2 ON 1=2;

ON 1=2 確保無資料列回傳,僅取得結構描述,同樣避開識別欄位繼承。

進階應用:動態 SQL 結果存入臨時表

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 級,連線關閉自動清理
  • 大量資料建立臨時表有 I/O 成本,適合中小資料集或低頻查詢
  • 高併發/大數據量建議升級至 SQL Server 2005+ 使用 ROW_NUMBER() 或 OFFSET/FETCH
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved