PHP 端調用代碼
$start = isset($_GET['start']) ? (int)$_GET['start'] : 0;
$end = isset($_GET['end']) ? (int)$_GET['end'] : 0;
$pageSize = isset($_GET['pagesize']) ? (int)$_GET['pagesize'] : 20;
$link = mssql_connect('localhost', 'sa', 'password') or die('連接失敗');
mssql_select_db('MyDB', $link);
$stmt = mssql_init('Bigdatabase', $link) or die('初始化失敗');
mssql_bind($stmt, '@pagesize', $pageSize, SQLINT4);
mssql_bind($stmt, '@start', $start, SQLINT4);
// 執行並獲取結果集
$result = mssql_execute($stmt, true); // true 返回結果集資源
if (!$result) die('執行失敗');
// 輸出數據
while ($row = mssql_fetch_assoc($result)) {
echo $row['username'] . '
';
}
// 釋放資源
mssql_free_result($result);
mssql_free_statement($stmt);
// 可選:清理 tempdb 日志(舊版本建議)
mssql_query("DUMP TRANSACTION tempdb WITH NO_LOG", $link);
SQL Server 2000 存儲過程:動態 SQL 分頁
CREATE PROCEDURE Bigdatabase
@pagesize INT,
@start INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @bsql NVARCHAR(4000);
SET @bsql = N'SELECT TOP ' + CAST(@pagesize AS NVARCHAR) +
N' username FROM person ' +
N'WHERE id NOT IN (SELECT TOP ' + CAST(@start AS NVARCHAR) +
N' id FROM person ORDER BY id ASC) ORDER BY id ASC';
EXEC sp_executesql @bsql;
END;
關鍵點解析
mssql_init 準備存儲過程,mssql_bind 綁定參數類型(SQLINT4 對應 INT)。
mssql_execute($stmt, true) 第二參數 true 表示返回結果集資源,false 僅執行無返回。
- 存儲過程使用
NOT IN (TOP N ...) 經典分頁模式(SQL 2000 無 ROW_NUMBER)。
DUMP TRANSACTION tempdb WITH NO_LOG 截斷 tempdb 日志,防止長時間運行日志暴漲(SQL 2000/2005 常用,2008+ 建議設置 SIMPLE 恢復模式)。
現代化遷移建議
- 棄用
mssql_* 擴展:PHP 7.0+ 已移除,改用 PDO_SQLSRV 或 sqlsrv 驅動(微軟官方維護)。
- 參數化查詢防注入:
$stmt = $pdo->prepare("EXEC Bigdatabase @pagesize=?, @start=?");
$stmt->execute([$pageSize, $start]);
- 分頁改用
OFFSET @start ROWS FETCH NEXT @pagesize ROWS ONLY(SQL 2012+)或 ROW_NUMBER(2005+)。
- 升級 SQL Server 2000 → 2019,獲得安全補丁、性能優化、新功能支持。