MSSQL,LINUX,从LAMP堆栈调用的存储过程中获取结果

时间:2017-10-18 06:53:41

标签: php sql-server stored-procedures pdo sqlsrv

我从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应该可行。 有什么建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

经过14天尝试所有可能的组合......这就是我想出的事情(如果你熟悉其他实验驱动因素的所有细节以及驱动程序,版本等的交叉影响,那么它是直截了当的。 ..)

经验教训:

  1. 对于任何MS集成进行隔离微服务
  2. 如果可以的话(因为在大多数情况下更新很难......)更新php和ubuntu版本
  3. 请勿使用sored程序像API一样工作!!!!! (在我的情况下,这个外部提供者以这种方式使用它)
  4. 再次阅读第3点并记住!!!!!!
  5. 所以这是我的解决方案: 要求:

    • Ubuntu 16.04
    • php&gt; 7.0(因为MS有一些“官方”支持)
    • 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']);