首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP 2.0 MSSQL 2000 相容性修正:Incorrect syntax near 'AS' 錯誤解決方案

     編輯:PHP 相關知識

問題背景

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 則正常。

根本原因

  • SQL Server 2000 不支援 ROW_NUMBER() 視窗函數(2005 才引入)
  • 驅動程式 parseLimit() 方法強制產生含 ROW_NUMBER 的 SQL
  • 導致 selectSql 模板與 parseLimit() 在 2000 版失效

快速修正方案(修改核心驅動)

檔案位置: ThinkPHP/Lib/Think/Db/Driver/DbMssql.class.php

1. 註銷 selectSql 屬性(第 25 行)

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 語法
  • 若需分頁,需自行撰寫原生 SQL:SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 20 id FROM table)
  • 其他 CRUD 功能(find()、select()、add() 等)恢復正常

替代方案:整合 ADOdb 庫(支援完整分頁)

若專案大量使用分頁,建議整合成熟的 ADOdb 資料庫抽象層。

步驟 1:下載並安裝 ADOdb

  • 下載 ADOdb 並解壓至 ThinkPHP/Extend/Vendor/adodb5/
  • 將 adodb.inc.php 重命名為 adodb.php

步驟 2:建立基底控制器

dbsql->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 支援更好。若專案允許,**升級框架版本**是最徹底的解決之道。

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