在 CMS 系統或推薦模組中,常需從資料表隨機抽取 N 筆資料供前端展示。本文記錄兩種在 MSSQL 中實現隨機排序的實用寫法,並解析其原理。
以下為 KingCMS 模板標籤中的實際 SQL 片段,從 kingart 表隨機取 15 筆顯示文章:
SELECT TOP 15 artid, arttitle, artpath, artdescription, artshow
FROM kingart
WHERE listid = 7 AND artshow = 1
ORDER BY RIGHT(CSTR(RND(-INT(RND(-TIMER())*100+artid)))*1000*NOW()), 2)
核心邏輯解析:
TIMER() 取得當前時間作為種子基礎RND(-INT(RND(...)*100+artid)) 結合主鍵 artid 產生唯一隨機值RIGHT(..., 2) 取右側兩位數字作為最終排序依據此寫法在 Access/MSSQL 混合環境下相容性較好,但函數嵌套較深,大數據量時效能稍弱。
SELECT TOP 15 * FROM kingart
WHERE listid = 7 AND artshow = 1
ORDER BY RND(artid) DESC;
優點:語法簡潔、可讀性強、利用主鍵確保每行種子不同。
注意: MSSQL 原生不支援 RND() 函數,此寫法適用於支援 VBA 函數的環境(如 Access、KingCMS 內建解析器)。純 MSSQL 環境請參考下文補充方案。
若在標準 SQL Server 環境,推薦使用 NEWID() 或 CHECKSUM(NEWID()):
-- 方案 A:NEWID()(唯一識別碼排序,資源較大)
SELECT TOP 15 * FROM kingart
WHERE listid = 7 AND artshow = 1
ORDER BY NEWID();
-- 方案 B:CHECKSUM(NEWID())(整數運算,效能更佳)
SELECT TOP 15 * FROM kingart
WHERE listid = 7 AND artshow = 1
ORDER BY CHECKSUM(NEWID());
ORDER BY NEWID() 簡單可靠。TABLESAMPLE、RAND() 配合主鍵篩選。隨機讀取在內容推薦、廣告輪播等場景極為常見。根據資料庫引擎與數據規模選擇合適方案,兼顧開發效率與執行效能。