在儲存程序中需動態決定 TOP N 筆數時,SQL Server 2000 僅支援動態 SQL 拼接,而 2005 起支援直接使用變數。本文對比兩種寫法、效能差異與最佳實務。
DECLARE @a INT = 1;
EXEC('SELECT TOP ' + CAST(@a AS VARCHAR(10)) + ' * FROM mtrcLanguages');
QUOTENAME)、除錯困難。DECLARE @a INT = 2;
SELECT TOP (@a) * FROM Common.tblCode tc;
TOP (@a * @b)。TOP 後**必須加括號** (@var)。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 | 高 | 低 |
| 注入風險 | 需手動防護 | 原生免疫 |
TOP (@var)**,拒絕動態 SQL 拼接。OFFSET/FETCH 或 Keyset Pagination (游標式),避免深分頁效能崩塌。sp_executesql (動態 SQL 時) 或原生參數 (原生 TOP 時)。版本升級不僅帶來新功能,更是寫法現代化的契機。棄用動態 SQL 拼接 TOP N,擁抱參數化查詢,讓程式碼更安全、更高效。