2009-11-23 30 views
0

我在我的應用程序嚴重的問題。PHP + SQL服務器+ SQL Server驅動程序= sqlsrv_num_rows嚴重的問題

當我做「CTE」選擇在我的SQL Server數據庫,然後我用sqlsrv_num_rows計算在結果對象中的行量我得到了奇怪的結果:-1。

這個值是連在手冊(聯繫:http://msdn.microsoft.com/en-us/library/ee376931(SQL.90).aspx)。

示例代碼:

W的選擇 'CTE - 公用表表達式' 例如:

$sql = ";WITH unsorted_cte AS 
(
    SELECT 
    * 
    FROM 
    xxx 
    WHERE 
    yyy 
) 

SELECT 
    u_cte.* 
FROM 
    [unsorted_cte] u_cte 
ORDER BY 
    u_cte.[zzzz] ASC"; 

在SQL控制檯@@行數有適當的值,但是當我們在PHP中使用這個選擇腳本返回-1。

樣本:

// make query with proper coursor 

$result = sqlsrv_query($link, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET)); 

// var dump shows us proper resource 

var_dump($result): 
resource(3) of type (SQL Server Statement) 

// sqlsrv_num_rows show us wrong rows count 

var_dump(sqlsrv_num_rows($result)); 
int(-1) 

// sqlsrv_errors are empty 

var_dump(sqlsrv_errors()); 
NULL 

我試圖修復它在整個coursors http://msdn.microsoft.com/en-us/library/ee376927(SQL.90).aspx和選擇行參數,我不能修復它。

btw。在我的情況下,唯一的選擇行是SQLSRV_CURSOR_FORWARD。

我的環境: PHP 5.3 MSSQL 2005 PHP 1.1 的Windows Server SQL Server驅動程序(MSDN點微軟點com/EN-US /庫/ ee229551(SQL.10)的.aspx) 數據庫編碼:統一

我希望,某人知道這個問題的解決方案。

+0

使用給定的工具格式化您的問題將使這個人更容易幫助您。使用看起來像二進制字符串的按鈕將代碼格式化爲代碼。 – Buggabill 2009-11-23 15:21:38

回答

1

這裏所描述的問題是一個暴露一個錯誤的ODBC驅動程序在其上SQLSRV驅動程序內置。 ODBC驅動程序對以WITH開頭的SQL查詢執行某種級別的解析,然後將其錯誤處理。解決方法是將查詢作爲存儲過程執行,從而更改由ODBC驅動程序執行的代碼路徑。

在SQL Server Native Client的團隊(SNAC是微軟實現的ODBC)是注意到了這個錯誤。我會確保他們知道這個錯誤造成的影響。

謝謝。

Brian Swan,Microsoft