1

我最近从 ODBC 切换到 SQLSRV 以从 PHP 连接 MS SQL 2008。存储过程中的 PRINT 函数存在一个奇怪的问题。如果 PRINT 函数显示超过大约 700 个字符,则返回“HTTP 错误 500.0 - 内部服务器错误”消息。

以下是我正在使用的工具列表:

  1. PHP 5.3.6
  2. 微软 SQL 服务器 2008
  3. [PHP_MSSQL]extension=php_sqlsrv_53_nts.dll
  4. IE8(此问题与其他浏览器以及 firefox、chrome 等浏览器有关)
  5. 网络服务器 IIS

以下是代码PHP CODE:

<?php

$link = sqlsrv_connect( 'dbname\instance2008', array( "UID"=>'UID',"PWD"=>'PWD',       "Database"=>'Database_name',"CharacterSet" => "UTF-8", "MultipleActiveResultSets" => 0)); 

if(!$link) die( print_r(sqlsrv_errors(), true));
sqlsrv_configure('WarningsReturnAsErrors', 0);

$sql = "EXEC spa_i18n_test";

$result = sqlsrv_query($link, $sql); 

if(!isset($result)){
    error_reporting(2047);
}

while( $row = sqlsrv_fetch_array( $result)){
echo $row[0] . ": " . $row[1] . "<br />"; 
}

?>

存储过程的脚本。

Create proc spa_i18n_test   
AS  
SET NOCOUNT ON   
print '2222222222222111111111111111112dddddddddddddd2222222222
        222111111111111111112dddddddddddddd2222222222222111111
        111111111112dddddddddddddd222222222222211111111111111111
        2dddddddddddddd222222222222211111111111111122222222222221
        11111111111111112dddddddddddddd222222222222211111111111111
        1112dddddddddddddd2222222222222111111111111111112dddddddddd
        dddd2222222222222111111111111111112dddddddddddddd22222222222
        221111111111111112222222222222111111111111111112dddddddddddd
        dd2222222222222111111111111111112dddddddddddddd2222222222222
        111111111111111112dddddddddddddd2222222222222111111111111111
        112dddddddddddddd2222222222222111111111111111222222222222211
        1111111111111112ddddddddd22222wwwwwwwwwwwwwwwwwwwwwwwwwwwwww
        wwwwwwwwwwwwwwwwwwwww'

select '1' a, '2' b  

我已经尝试过http://support.microsoft.com/kb/269412中给出的解决方案,但遗憾的是它对我不起作用。

请分享一些解决方法。

4

3 回答 3

1

我不确定是什么导致了您的“700”限制。但即便如此,“PRINT”仍然有8000的限制。

一种解决方法是将“打印”文本分成更小的块。例如:

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/45be5ec4-2038-4d06-9831-cb18207a676b/executing-dynamic-sql-larger-than-8000-characters

于 2013-09-21T03:15:08.993 回答
1

SQLSRV 不允许执行打印消息导致错误。利用

sqlsrv_configure('WarningsReturnAsErrors', 0);

就在之前

sqlsrv_query()

功能来抑制错误。即仅禁用,但在数据库层不忽略。

于 2013-09-20T11:31:25.067 回答
1

当字符数大于约 5200 个字符时,此问题在使用 sqlsrv 驱动程序 4.1.2 (x64) 的 PHP 7.0.11 中仍然存在。

sqlsrv_configure('WarningsReturnAsErrors', 0);很重要,但不能解决问题。

我的解决方法是向有问题的存储过程添加一个位参数,以选择性地抑制由于 PRINT 命令导致的问题输出。

于 2016-10-05T08:16:17.477 回答