2009-11-23 6 views
0

내 응용 프로그램에 심각한 문제가 있습니다.PHP + SQL Server + SQL Server 드라이버 = sqlsrv_num_rows 심각한 문제

SQL Server 데이터베이스에서 'CTE'를 선택한 다음 sqlsrv_num_rows를 사용하여 결과 개체의 행 개수를 계산할 때 이상한 결과가 발생합니다. -1.

이 값은 수동 (링크 : http://msdn.microsoft.com/en-us/library/ee376931(SQL.90).aspx)에도 적용되지 않습니다.

샘플 코드 :

W가 선택 'CTE - 공통 테이블 식'을 갖고, 예를 들면 :

SQL 콘솔에서
$sql = ";WITH unsorted_cte AS 
(
    SELECT 
    * 
    FROM 
    xxx 
    WHERE 
    yyy 
) 

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

@@ 행 개수 적절한 값을 가지고 있지만, 우리는 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 윈도우 서버 SQL 서버 드라이버 (MSDN 점 마이크로 소프트 닷컴/EN-US/라이브러리/ee229551 (SQL.10)에서 .aspx) 데이터베이스 인코딩 : 유니 코드

나는이 문제의 해결책을 알고있다.

+0

제공된 도구를 사용하여 질문 서식을 지정하면 다른 사람이 쉽게 참조 할 수 있습니다. 코드를 코드로 포맷하려면 이진 문자열처럼 보이는 버튼을 사용하십시오. – Buggabill

답변

1

여기서 설명하는 문제는 sqlsrv 드라이버가 빌드 된 ODBC 드라이버의 버그를 표시하는 문제입니다. ODBC 드라이버는 WITH로 시작하는 SQL 쿼리의 구문 분석 수준을 수행합니다.이 SQL 쿼리는 잘못 처리됩니다. 이 문제를 해결하려면 쿼리를 저장 프로 시저로 실행하면 ODBC 드라이버에서 실행되는 코드 경로가 변경됩니다.

SQL Server Native Client 팀 (SNAC는 Microsoft의 ODBC 구현)은이 버그를 알고 있습니다. 이 버그로 인해 영향을 받는지 확인합니다.

감사합니다.

Brian Swan, Microsoft