PHP sql_srv_rows_affected返回多个输出

时间:2015-10-12 12:17:48

标签: php sql-server rows-affected

我创建了一个存储过程来导入记录列表。此存储过程根据合同号是否匹配,INSERT到临时表然后MERGE。当它没有与TARGET匹配时,它会插入到真实的表中,当它与源不匹配时,它会从实际表中删除它。

这很好用,我正在使用的问题是PHP试图让它回应SQL SERVER消息:

(2384 row(s) affected)

(2 row(s) affected)

“(受影响的2384行)”的第一条消息显示sql_srv_rows_affected,但第二条“(2行(s)受影响)”没有。其中第一个是导入到临时表中,第二个结果是受MERGE语句影响的行数。

这是我的代码,用于回显受影响的行:

$rows_affected = sqlsrv_rows_affected($Result);
if( $rows_affected === false) {
    die( print_r( sqlsrv_errors(), true));
} 
elseif( $rows_affected == -1) {
    echo "No information available.<br />";
} 
else {
    echo $rows_affected." rows were updated.<br />";
}

我能做一段时间的声明来实现我想要的吗?

提前谢谢!

编辑: 以下是有效的代码:

$rows_affected = sqlsrv_rows_affected( $PPListImportResult);
$next_result = sqlsrv_next_result($PPListImportResult);
if( $rows_affected === false) {
    die( print_r( sqlsrv_errors(), true));
} 
elseif( $rows_affected == -1) {
    echo "No information available.<br />";
} 
else {
    echo $rows_affected." rows were updated.<br />";
    echo $next_result." rows were updated.<br />";
}

如果我有超过2个结果,我可以将$ next_result变量改为while语句。

1 个答案:

答案 0 :(得分:1)

对于更多读者,这里有一个更详细的答案:

大多数RDMS都能够执行批处理(一次运行中有多个查询)。从应用程序的角度来看,包含多个查询的存储过程将作为批处理显示。

使用SQL Server,所有语句(查询)都在结果集中拥有自己的结果,但大多数函数默认提取第一个语句。

应用程序应使用库的相关功能设置后续结果处于活动状态。在sqlsrv_*函数系列中,此函数为mixed sqlsrv_next_result ( resource $stmt )

  

使指定语句的下一个结果处于活动状态。结果包括结果集,行计数和输出参数。

     

如果成功检索到下一个结果,则返回TRUE;如果发生错误,则返回FALSE;如果没有更多结果要检索,则返回NULL。

在PHP手册中阅读有关此功能的更多信息:http://php.net/manual/en/function.sqlsrv-next-result.php

有一个例子(没有错误处理和其他花哨的东西):

$stmt = sql_server_query($conn, $query, $params);
$affectedRows = array();
do {
  echo 'Rows affected: ' . sqlsrv_rows_affected($stmt)
} while (sqlsrv_next_result($stmt))