2天前,SQL Admin将MSSQL从2008年升级到2008 R2。 在升级之前,我使用FreeTDS的MSSQL,但升级后我无法从存储过程中读取任何输出参数。所以我从Microsoft Site for Linux安装了官方ODBC驱动程序(我正在使用CentoOS 64) 现在: 我可以连接,进行简单的查询,但我无法从存储过程中捕获任何输出参数,也无法捕获查询输出:
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 :(得分:0)
我猜(驱动程序管理器跟踪可能会显示更多)驱动程序将结果列描述为blob / clob / var(max)类型,它将返回4Gb或者-1的长度。如果PHP决定尝试分配那么多,它会失败,如你所见。我会说它是PHP的一个缺陷。您可以尝试将XML列转换为TEXT类型,这可能会使PHP成为longdata类型,而不是尝试将其保存在一个块中。在Easysoft驱动程序中,我们添加了一个标志来限制报告的长类型大小以避免这种情况,但这对MS驱动程序没什么帮助。
答案 1 :(得分:0)
您可以尝试将值转换为varchar(您选择的大小)。
即 改变这一行:
select OutputString from tTableOutput where ID = 5
到
select cast(OutputString as varchar(255)) from tTableOutput where ID = 5
这将阻止查询报告4GB的大小。