Я создал хранимую процедуру для импорта списка записей. Эта хранимая процедура вставляет во временную таблицу, а затем 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.
Для дальнейших читателей, вот немного более подробный ответ:
Большинство СУБД способны выполнять пакеты (более одного запроса за один прогон). С точки зрения приложения хранимая процедура, которая содержит более одного запроса, отображается как пакет.
При использовании 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))
Других решений пока нет …