2013-11-28 2 views
0

SQL 관리자가 2008 년부터 2008 R2까지 MSSQL을 업그레이드했습니다. 이 업그레이드를하기 전에 FreeTDS에서 MSSQL을 사용했지만 업그레이드 후에는 저장 프로 시저의 출력 매개 변수를 읽을 수 없었습니다. 그래서 나는 리눅스 용 Microsoft Site에서 공식 ODBC 드라이버를 설치했다. (CentoOS 64를 사용하고있다.) Now : 나는 간단한 쿼리를 만들 수 있지만 저장 프로 시저의 출력 매개 변수를 잡을 수 없다. 쿼리 결과 출력 :CENTOS PHP PDO ODBC MSSQL 2008 r2

select OutputString from tTableOutput where ID = 5 

여기서 OuptutString은 큰 xml을 포함합니다.

PDO, ODBC 및 모든 기능이 작동하지 않습니다. 내가 PDO를 사용하는 경우 :

$result = $db->query("select OutputString from tTableOutput with(nolock) where ID = 5"); 
foreach ($result as $row) { 
    print_r($row); 
} 

를 내가 얻을 :

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[01004]: String data, right truncated: 0 [Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation (SQLFetchScroll[0] at /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:528)

어떻게 길이 제한을 늘릴 수 있습니까? 내가 ODBC를 사용하는 경우

:

$conn = odbc_connect($dataSource,$user,$password); 
$sql = "select OutputString from tTableOutput where ID = 5"; 

$rs=odbc_exec($conn,$sql); 
odbc_binmode ($rs, ODBC_BINMODE_PASSTHRU); 
odbc_longreadlen ($rs, 0); 

if (!$rs){ 
    exit("Error in SQL"); 
} 
while (odbc_fetch_row($rs)){ 
    print_r(odbc_result($rs, "OutputString")); 

} 
odbc_close($conn); 

를 내가 얻을 :

PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 4294967293 bytes) 

왜이 쿼리는 4GB의 메모리가 필요하십니까?

내가

답변

0

내가 입력 드라이버가 BLOB/CLOB/VAR (최대)와 같은 결과 열을 설명하는 것을 (A 드라이버 관리자 추적이 더 표시 할 수 있습니다) 생각하는 어떤 도움을 고맙게 생각하고 반환됩니다 4Gb 또는 아마도 -1의 길이. PHP가 그 할당을 시도하기로 결정했다면, 당신이 보는 것처럼 실패 할 것입니다. 나는 PHP에 결함이 있다고 말할 것이다. XML 컬럼을 TEXT 타입으로 변환하면 PHP가 longdata 타입을 이해할 수 있고 그것을 하나의 청크에 저장하지 않을 수 있습니다. Easysoft 드라이버에서 우리는 long 타입의보고 된 크기를 제한하기위한 플래그를 추가하여이를 방지했지만 MS 드라이버에별로 도움이되지 않습니다.

0

값을 varchar (원하는 크기)로 캐스팅 할 수 있습니다.

select OutputString from tTableOutput where ID = 5 

select cast(OutputString as varchar(255)) from tTableOutput where ID = 5 

이 4GB의 크기를보고 쿼리를 방지 할 수 있습니다 :

즉 선을 변경 .