1

我创建了一个存储过程来导入记录列表。此存储过程插入到临时表,然后根据合同编号是否匹配进行合并。WHEN NOT MATCHED BY TARGET 将其插入到真实表中,而 WHEN NOT MATCHED BY SOURCE 则从真实表中删除。

这很好用,我正在处理的问题是在 PHP 中试图让它回显 SQL SERVER 消息:

(2384 row(s) affected)

(2 row(s) affected)

“(2384 行受影响)”的第一条消息显示为 sql_srv_rows_affected,但第二条消息“(2 行受影响)”没有。第一个是临时表的导入,第二个结果是受 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 语句。

4

1 回答 1

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))
于 2015-10-12T12:59:36.990 回答