業務常需「抽取前 10% 資料」、「隨機抽樣 5%」等按百分比查詢場景。SQL Server 提供原生 TOP (n) PERCENT 語法支援。
CREATE PROCEDURE pro_topPercent
@ipercent INT = 0 -- 0 表不返回
AS
BEGIN
SELECT TOP (@ipercent) PERCENT * FROM books;
END
-- 呼叫:抽取 10%
EXEC pro_topPercent 10;
特點:語法簡潔、優化器原生支援、百分比需為常數或變數,不可為運算式。
CREATE PROCEDURE pro_topPercent
@ipercent INT = 0
AS
BEGIN
SELECT TOP ((SELECT COUNT(*) FROM books) * @ipercent / 100) * FROM books;
END
EXEC pro_topPercent 10;
特點:可整合複雜邏輯(如加 WHERE 條件後再按比例)、相容舊版本。
| 項目 | 建立時 | 執行時 |
|---|---|---|
| 參數宣告 | @ipercent INT = 0(小括號) | 無括號:EXEC pro_topPercent 10 |
| 輸出參數 | @result INT OUTPUT | 需先宣告變數:DECLARE @r INT; EXEC pro @r OUTPUT |
| .NET 調用 | - | SqlParameter.Direction = ParameterDirection.Output |
TOP PERCENT 依 ORDER BY 排序後取前 N%,無排序則結果不確定SELECT TOP (10) PERCENT WITH TIES ... ORDER BY score 會包含並列邊界值的所有行COUNT(*) 會掃描全表/索引,考慮快取總筆數或使用統計資訊估算TABLESAMPLE (10 PERCENT)(頁面層級抽樣,非行層級,結果近似)或 ORDER BY NEWID() 配合 TOP PERCENT| 場景 | 推薦方式 |
|---|---|
| 固定比例報表、儀表板 | TOP (@p) PERCENT |
| 動態比例、複雜前置過濾 | 動態計算 TOP (COUNT * @p / 100) |
| 統計抽樣、近似查詢 | TABLESAMPLE / ORDER BY NEWID() |