【问题标题】:PHP sql_srv_rows_affected to return multiple outputsPHP sql_srv_rows_affected 返回多个输出
【发布时间】:2016-01-09 22:07:02
【问题描述】:

我创建了一个存储过程来导入记录列表。此存储过程插入到临时表,然后根据合同编号是否匹配进行合并。 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 语句。

【问题讨论】:

  • 批次有2个结果,大部分函数只取第一个结果。尝试通过sqlsrv_next_result()进入下一个结果
  • 谢谢你,我会试着把它放在一起,然后告诉你
  • 感谢您的完美工作!

标签: php sql-server rows-affected


【解决方案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))

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2011-08-01
    相关资源
    最近更新 更多