1

レコードのリストをインポートするストアド プロシージャを作成しました。このストアド プロシージャは、一時テーブルに INSERT を実行し、契約番号が一致するかどうかに基づいて MERGE を実行します。TARGET によって一致しない場合は実際のテーブルに INSERT し、SOURCE によって一致しない場合は実際のテーブルから DELETE します。

これは問題なく動作します。私が取り組んでいる問題は、SQL SERVER メッセージをエコーするようにしようとしている PHP にあります。

(2384 row(s) affected)

(2 row(s) affected)

「(2384 行が影響を受けました)」の最初のメッセージは sql_srv_rows_affected で表示されますが、2 番目の「(2 行が影響を受けました)」は表示されません。最初の結果は一時テーブルへのインポートで、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 />";
}

探しているものを達成するために while ステートメントを実行できますか?

前もって感謝します!

編集:これが機能したコードです:

$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 ステートメントに変更できます。

4

1 に答える 1

1

さらなる読者のために、もう少し詳細な回答を次に示します。

ほとんどの RDMS は、バッチ (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))
于 2015-10-12T12:59:36.990 に答える