ThinkPHP 2.0 內建的 MSSQL 驅動(DbMssql.class.php)針對 SQL Server 2005+ 設計,使用 ROW_NUMBER() 函數實現分頁。但在 SQL Server 2000 環境下執行 M() 或 D() 模型查詢時,會拋出錯誤:
Incorrect syntax near the keyword 'AS'.
而直接使用 query() 執行原生 SQL 則正常。
ROW_NUMBER() 視窗函數(2005 才引入)parseLimit() 方法強制產生含 ROW_NUMBER 的 SQLselectSql 模板與 parseLimit() 在 2000 版失效檔案位置: ThinkPHP/Lib/Think/Db/Driver/DbMssql.class.php
1)
$limitStr = '(T1.ROW_NUMBER BETWEEN '.$limit[0].' + 1 AND '.$limit[0].' + '.$limit[1].')';
else
$limitStr = '(T1.ROW_NUMBER BETWEEN 1 AND '.$limit[0].")";
return $limitStr;
}
// 修改為:直接回傳空字串,不使用 LIMIT 子句
public function parseLimit($limit) {
return '';
}
limit() 分頁:MSSQL 2000 僅支援 TOP N 語法SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 20 id FROM table)find()、select()、add() 等)恢復正常若專案大量使用分頁,建議整合成熟的 ADOdb 資料庫抽象層。
ThinkPHP/Extend/Vendor/adodb5/adodb.inc.php 重命名為 adodb.phpdbsql->SelectLimit('SELECT * FROM xxx', 10, 20); // 10 筆,offset 20
while ($row = $rs->FetchRow()) {
echo $row['field'];
}
// 簡單查詢仍可用 ThinkPHP Model
$user = M('User')->find(1);
}
}
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 修改驅動 | 零依賴、改動最小 | 失去 limit() 分頁功能 | 無分頁需求、快速修正 |
| 整合 ADOdb | 完整支援分頁、多資料庫相容 | 增加依賴、雙重資料庫連線 | 大量分頁、長期維護專案 |
ThinkPHP 官方後續版本(3.x/5.x/6.x)已重寫資料庫驅動,對 MSSQL 2000 支援更好。若專案允許,**升級框架版本**是最徹底的解決之道。