PHP sql_srv_rows_affected 到 return 多个输出

PHP sql_srv_rows_affected to return multiple outputs

我创建了一个存储过程来导入记录列表。此存储过程插入到临时 table,然后根据合同号是否匹配进行合并。当目标不匹配时,它会插入到真实的 table 中,当源不匹配时,它会从真实的 table.

中删除

这工作正常,我正在处理的问题是 PHP 试图让它回应 SQL 服务器消息:

(2384 row(s) affected)

(2 row(s) affected)

第一条消息“(2384 行受影响)”显示为 sql_srv_rows_affected,但第二条消息“(2 行受影响)”没有。其中第一个是对临时 table 的导入,第二个结果是受 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 />";
}

我可以做一个 while 语句来实现我正在寻找的东西吗?

提前致谢!

编辑: 这是有效的代码:

$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 语句。

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

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

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

应用程序应使用库的相关函数将后续结果设置为活动状态。在sqlsrv_*函数族中,这个函数是mixed sqlsrv_next_result ( resource $stmt ).

Makes the next result of the specified statement active. Results include result sets, row counts, and output parameters.

Returns TRUE if the next result was successfully retrieved, FALSE if an error occurred, and NULL if there are no more results to retrieve.

在 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))