Я создал хранимую процедуру для импорта списка записей. Эта хранимая процедура INSERT приводит к временной таблице, а затем MERGE на основе соответствия номеров контрактов. КОГДА НЕ СОБИРАЕТСЯ ТАРИФОМ, он ВСТАВЛЯЕТСЯ в реальный стол, а КОГДА НЕ СОБИРАЕТСЯ ИСТОЧНИКОМ, он УДАЛЯЕТСЯ из реальной таблицы.
Это прекрасно работает, проблема, с которой я работаю, заключается в 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 />";
}
Могу ли я сделать какое-то выражение для достижения того, что я ищу?
Заранее спасибо!
EDIT: Вот код, который сработал:
$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 />";
}
Если бы у меня было более двух результатов, я мог бы вместо этого изменить переменную $ next_result вместо while.
Для дальнейших читателей, вот немного более подробный ответ:
Большинство 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))