我创建了一个存储过程来导入记录列表。此存储过程根据合同号是否匹配,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语句。
答案 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))