我从LAMP环境调用MSSQL过程遇到了一个有趣的挑战。我更喜欢使用php 5.3和ubuntu 12.04(PDO和dblib驱动程序,因为当前的生产设置)或最坏的情况下ubuntu 16.04和php 7.1(使用官方ms ODBC驱动程序,以及另一个更新环境的微服务)。我的挑战是调用存储过程,它将XML作为参数,并返回一些XML结果。连接工作,但我无法读取输出参数。
MSSQL存储过程如下所示(如果从SQLPro for MSSQL运行,查询也按预期工作):
DECLARE @return_value int
DECLARE @lpc_odgovor xml
EXEC @return_value =
store_proc_name
@lpx_plan = '',
@lpc_odgovor = @lpc_odgovor out
SELECT
'Return Value' = @return_value,
'Response'=@lpc_odgovor
Response is in 2 column
1 col:
Return Value
-5 (which is some status code...
2 col:
Response
'<xml>some xml string</xml>' (what i need for further work)
目前,由于官方的MS支持,我更倾向于使用php 7.1和ubuntu 16.04。我最近最成功的尝试看起来像这样:
$connectionInfo = array(
"Database" => "xx",
"UID" => "x",
"PWD" => "xx"
);
$conn = sqlsrv_connect('server, port', $connectionInfo);
$document = '<someXml></someXML>';
$myparams = [
'lpx_plan' => $document,
'lpc_odgovor' => '',
];
$odgovor = null;
$params = array(
array(
&$myparams['lpx_plan'],
SQLSRV_PARAM_IN,
SQLSRV_PHPTYPE_STRING('UTF-8'),
SQLSRV_SQLTYPE_XML
),
array(
&$odgovor,
SQLSRV_PARAM_INOUT,
SQLSRV_PHPTYPE_STRING('UTF-8'),
SQLSRV_SQLTYPE_XML
)
);
$sql = "EXEC store_proc_name @lpx_plan=?,@lpc_odgovor=?;";
$result = sqlsrv_query($conn, $sql, $params);
if ($result === false) {
echo "Error in executing statement 3.\n";
die(print_r(sqlsrv_errors(), true));
}
$rss = array();
do {
$rs = array();
var_dump($result);
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
array_push($rs, $row);
}
array_push($rss, $rs);
} while (sqlsrv_next_result($result));
var_dump($rs);
但是现在没有成功检索输出参数......
我尝试了不同的变体
How to execute a stored procedure in php using sqlsrv and "?" style parameters
http://trentrichardson.com/2011/08/10/making-sense-of-stored-procedures-with-php-pdo-and-sqlsrv/
Executing a Stored Procedure with pdo_sqlsrv
Calling stored procedure from PHP using PDO to MSSQL Server using INPUT Paramters
我在MS Side上阅读了大多数关于指定IN / OUT参数类型的相关文档: https://docs.microsoft.com/en-us/sql/connect/php/how-to-retrieve-output-parameters-using-the-sqlsrv-driver
我试图在一周内获得数据,但是现在没有任何更大的成功(甚至对于我提出的每个新关键字,我已经打开了大部分链接并尝试其他人解决方案)。
但另一方面似乎我的联系还可以。我也可以运行基本的SQL'SELECT * FROM some_table WHERE ....',我可能不是第一个尝试读取任何存储过程响应的人。
如果需要,可以并且将提供任何进一步的数据。我错过了什么?我对新的驱动程序,新的连接方式持开放态度......但我确信sqlsrv应该可行。 有什么建议吗?
提前致谢。
答案 0 :(得分:0)
经过14天尝试所有可能的组合......这就是我想出的事情(如果你熟悉其他实验驱动因素的所有细节以及驱动程序,版本等的交叉影响,那么它是直截了当的。 ..)
经验教训:
所以这是我的解决方案: 要求:
php modules odbc,sqlsrv,pdo_sqlsrv
$connectionInfo = [
"Database" => "xxx",
"UID" => "xx",
"PWD" => "xxx"
];
$conn = sqlsrv_connect('xx, xx', $connectionInfo);
$document = 'some xml';
$myparams = [
'lpx_plan' => $document,
'lpc_odgovor' => '',
];
$params = [
[
&$myparams['lpx_plan'],
SQLSRV_PARAM_IN,
SQLSRV_PHPTYPE_STRING('UTF-8'),
SQLSRV_SQLTYPE_XML
],
[
&$myparams['lpc_odgovor'],
SQLSRV_PARAM_INOUT,
SQLSRV_PHPTYPE_STRING('UTF-8'),
SQLSRV_SQLTYPE_XML
]
];
$sql = "EXEC call_procedure_name @lpx_plan=?,@lpc_odgovor=?;";
var_dump($conn);
$result = sqlsrv_query($conn, $sql, $params);
if ($result === false) {
echo "Error in executing statement 3.\n";
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_next_result($result);
var_dump($myparams['lpc_odgovor']);
var_dump($myparams['lpx_plan']);