PHP sql_srv_rows_affered для возврата нескольких выходных данных

1

Я создал хранимую процедуру для импорта списка записей. Эта хранимая процедура 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.

  • 0
    В пакете 2 результата, большинство функций извлекают только первый результат. Попробуйте перейти к следующему результату с помощью sqlsrv_next_result ()
  • 0
    Спасибо, я постараюсь собрать это вместе и дам вам знать
Показать ещё 1 комментарий
Теги:
sql-server
rows-affected

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню