【问题标题】:SQLSRV PRINT function issueSQLSRV PRINT 函数问题
【发布时间】:2013-06-18 11:51:49
【问题描述】:

我最近从 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. 网络服务器 IIS

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

请分享一些解决方法。

【问题讨论】:

    标签: php sql-server printing sqlsrv


    【解决方案1】:

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

    sqlsrv_configure('WarningsReturnAsErrors', 0);
    

    就在之前

    sqlsrv_query()
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多