出現問題的程式碼如下:

1
2
3
4
5
<?php
$sSQL = "select ..."; //超過 300 個字元的SQL指令
$proc = mssql_init('MyPagingRecordSet', $db_link);
mssql_bind($proc, '@strSQL', $sSQL, SQLVARCHAR, false, false) or print_r(error_get_last());
?>

執行的預儲程序

1
2
3
4
5
6
7
CREATE PROCEDURE MyPagingRecordSet
  @strSQL VARCHAR(1000),  --查詢 sql,如 select * from [user]
  @PageIndex INT = 1,     --查詢的頁號
  @PageSize INT = 30      --每頁顯示紀錄數
AS
--省略內容
GO

不過當 $sSQL 變數內只有很短的 SQL 命令時, 程式是可以正常執行的, 所以改成指定參數長度如下:

1
mssql_bind($proc, '@strSQL', $sSQL, SQLVARCHAR, false, false, 1000) or print_r(error_get_last());

執行結果還是一樣的錯誤訊息, 這應該是字串長度導致的問題, 再把程式改成

1
mssql_bind($proc, '@strSQL', $sSQL, SQLTEXT, false, false) or print_r(error_get_last());

這樣就可以正常執行了, 而 Stored Procedure 的參數的資料型別也可以改成

1
2
3
4
5
6
7
CREATE PROCEDURE MyPagingRecordSet
  @strSQL text,        --查詢 sql,如 select * from [user]
  @PageIndex INT = 1,  --查詢的頁號
  @PageSize INT = 30   --每頁顯示紀錄數
AS
--省略內容
GO

是否要改, 就看執行上是否有其他問題了, 目前沒改也可以執行.