sql server — PHP sql_srv_rows_affect для возврата нескольких выходных данных

Я создал хранимую процедуру для импорта списка записей. Эта хранимая процедура вставляет во временную таблицу, а затем MERGE, если номера контрактов совпадают. КОГДА НЕ СОГЛАСОВАНО ЦЕЛЕВЫМ, оно ВСТАВЛЯЕТСЯ в реальную таблицу, И КОГДА НЕ СОГЛАСУЕТСЯ ИСТОЧНИКОМ, УДАЛЯЕТСЯ из реальной таблицы.

Это работает нормально, проблема, с которой я работаю, заключается в том, что PHP пытается заставить его отображать сообщения SQL SERVER:

(2384 row(s) affected)

(2 row(s) affected)

Первое сообщение «(затронуто 2384 строк)» отображается с sql_srv_rows_affered, а второе сообщение «(затронуто 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 />";
}

Могу ли я сделать заявление, чтобы достичь того, что я ищу?

Заранее спасибо!

РЕДАКТИРОВАТЬ:
Вот код, который работал:

$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.

1

Решение

Для дальнейших читателей, вот немного более подробный ответ:

Большинство СУБД способны выполнять пакеты (более одного запроса за один прогон). С точки зрения приложения хранимая процедура, которая содержит более одного запроса, отображается как пакет.

При использовании 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))
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]