SQLSRV PRINT函数问题

时间:2013-06-18 11:51:49

标签: php sql-server printing sqlsrv

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

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

  1. PHP 5.3.6
  2. MS SQL Server 2008
  3. [PHP_MSSQL] extension = php_sqlsrv_53_nts.dll
  4. IE8(此问题与其他浏览器一样,如firefox,chrome)
  5. Web服务器IIS
  6. 以下是代码 PHP代码:

    <?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 />"; 
    }
    
    ?>
    

    SCRIPT FOR存储过程。

    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中给出的解决方案,但遗憾的是它对我不起作用。

    请分享一些解决方法。

3 个答案:

答案 0 :(得分:1)

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

sqlsrv_configure('WarningsReturnAsErrors', 0);

之前

sqlsrv_query()

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

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