首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server SELECT TOP 變數語法差異:SQL 2000 動態 SQL vs 2005+ 直接參數化

     編輯:MySQL 資料庫相關知識

在儲存程序中需動態決定 TOP N 筆數時,SQL Server 2000 僅支援動態 SQL 拼接,而 2005 起支援直接使用變數。本文對比兩種寫法、效能差異與最佳實務。

SQL Server 2000 (所有版本通用):動態 SQL 拼接

DECLARE @a INT = 1;
EXEC('SELECT TOP ' + CAST(@a AS VARCHAR(10)) + ' * FROM mtrcLanguages');
  • 優點:相容所有版本。
  • 缺點:編譯計畫無法重用 (每次不同字串)、注入風險 (需 QUOTENAME)、除錯困難。

SQL Server 2005+:直接參數化 (推薦)

DECLARE @a INT = 2;
SELECT TOP (@a) * FROM Common.tblCode tc;
  • 優點:計畫重用、防注入、可讀性高、支援複雜運算式 TOP (@a * @b)。
  • 語法要求:TOP 後**必須加括號** (@var)。

進階:配合 OFFSET/FETCH (2012+)

DECLARE @pageSize INT = 20, @pageIndex INT = 0;
SELECT * FROM LargeTable
ORDER BY ID
OFFSET @pageIndex * @pageSize ROWS
FETCH NEXT @pageSize ROWS ONLY;

效能對比 (百萬筆測試)

指標動態 SQL (2000)參數化 TOP (2005+)
計畫快取命中率低 (每參數組合一個計畫)高 (單一參數化計畫)
編譯 CPU高低
注入風險需手動防護原生免疫

最佳實務建議

  1. SQL 2005+ 專案**一律使用 TOP (@var)**,拒絕動態 SQL 拼接。
  2. 若必須支援 2000,將動態 SQL 封裝於獨立儲存程序,主程式呼叫,隔離風險。
  3. 大量分頁查詢改用 OFFSET/FETCH 或 Keyset Pagination (游標式),避免深分頁效能崩塌。
  4. 參數化查詢一律搭配 sp_executesql (動態 SQL 時) 或原生參數 (原生 TOP 時)。

版本升級不僅帶來新功能,更是寫法現代化的契機。棄用動態 SQL 拼接 TOP N,擁抱參數化查詢,讓程式碼更安全、更高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved