我最近从ODBC切换到SQLSRV以从PHP连接MS SQL 2008。存储过程中的PRINT功能存在一个奇怪的问题。如果PRINT功能显示超过约700个字符,则返回“HTTP错误500.0 - 内部服务器错误”消息。
以下是我正在使用的工具列表:
以下是代码 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中给出的解决方案,但遗憾的是它对我不起作用。
请分享一些解决方法。
答案 0 :(得分:1)
SQLSRV不允许执行打印消息导致错误。使用
sqlsrv_configure('WarningsReturnAsErrors', 0);
之前
sqlsrv_query()
用于抑制错误的功能。即仅禁用,但不在数据库层忽略。
答案 1 :(得分:0)
我不确定是什么导致了你的“700”限制。但即便如此,“PRINT”仍有8000的限制。
一种解决方法是将“打印”文本拆分为较小的块。例如:
答案 2 :(得分:0)
当字符数大于约5200个字符时,使用sqlsrv驱动程序4.1.2(x64)在PHP 7.0.11中仍存在此问题。
sqlsrv_configure('WarningsReturnAsErrors', 0);
很重要但不能解决问题。
我的解决方法是向有问题的存储过程添加一个位参数,以选择性地抑制PRINT命令导致的问题输出。