Start · Sprachen · PHP · Referenz · sqlsrv_next_result

sqlsrv_next_result

Funktion

Aktiviert das nächste Ergebnis (Resultset, Zeilenanzahl oder Ausgabeparameter) eines mit <code>sqlsrv_query</code> oder <code>sqlsrv_execute</code> ausgeführten Statements.

seit PHP 5.2.0 Kategorie: db

Signatur

sqlsrv_next_result(resource $stmt): bool|null

Beschreibung

sqlsrv_next_result wird verwendet, wenn ein SQL-Statement mehrere Ergebnismengen zurückliefert – etwa bei gespeicherten Prozeduren oder Batch-Abfragen, die mehrere SELECT-Anweisungen enthalten. Nach dem Aufruf von sqlsrv_query oder sqlsrv_execute zeigt der Cursor standardmäßig auf das erste Resultset. Mit sqlsrv_next_result wird zum nächsten Ergebnis gewechselt.

Die Funktion kann auch genutzt werden, um Zeilenanzahlen (row counts) von INSERT-, UPDATE- oder DELETE-Anweisungen innerhalb eines Batches zu verarbeiten, bevor das eigentliche Resultset erreichbar wird. Solange noch weitere Ergebnisse vorhanden sind, gibt die Funktion true zurück. Wenn kein weiteres Ergebnis mehr vorhanden ist, wird null zurückgegeben; bei einem Fehler wird false zurückgegeben.

Typischerweise wird sqlsrv_next_result in einer while-Schleife eingesetzt, um alle Resultsets einer gespeicherten Prozedur nacheinander abzuarbeiten. Innerhalb des jeweiligen Resultsets können die Zeilen wie gewohnt mit sqlsrv_fetch_array oder sqlsrv_fetch_object abgerufen werden.

Parameter

Name Typ Default Beschreibung
$stmt Pflicht resource Das Statement-Handle, das von sqlsrv_query oder sqlsrv_execute zurückgegeben wurde und dessen nächstes Ergebnis aktiviert werden soll.

Rückgabewert

Typ
bool|null
Beschreibung
Gibt true zurück, wenn das nächste Ergebnis erfolgreich aktiviert wurde. Gibt null zurück, wenn kein weiteres Ergebnis vorhanden ist. Gibt false zurück, wenn ein Fehler aufgetreten ist.

Beispiele

Mehrere Resultsets einer gespeicherten Prozedur verarbeiten

<?php
$serverName = "localhost";
$connectionInfo = ["Database" => "TestDB", "UID" => "sa", "PWD" => "geheim"];
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}

// Gespeicherte Prozedur gibt zwei SELECT-Resultsets zurück
$sql = "{CALL dbo.GetMultipleResults}";
$stmt = sqlsrv_query($conn, $sql);

if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

$resultsetIndex = 0;
do {
    $resultsetIndex++;
    echo "=== Resultset $resultsetIndex ===\n";
    while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        print_r($row);
    }
} while (sqlsrv_next_result($stmt));

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
=== Resultset 1 === Array ( [id] => 1 [name] => Beispiel ) === Resultset 2 === Array ( [id] => 42 [status] => aktiv )

Batch-Abfrage mit INSERT und abschließendem SELECT

<?php
$serverName = "localhost";
$connectionInfo = ["Database" => "TestDB", "UID" => "sa", "PWD" => "geheim"];
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}

// Batch: erst INSERT (liefert row count), dann SELECT
$sql = "INSERT INTO produkte (name) VALUES ('Neues Produkt');
        SELECT id, name FROM produkte ORDER BY id DESC;";

$stmt = sqlsrv_query($conn, $sql);

if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

// Erstes Ergebnis ist der row count des INSERT — überspringen
// Zum SELECT-Resultset wechseln
$next = sqlsrv_next_result($stmt);

if ($next === true) {
    echo "Produkte nach dem INSERT:\n";
    while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        echo $row['id'] . ': ' . $row['name'] . "\n";
    }
} elseif ($next === false) {
    echo "Fehler: " . print_r(sqlsrv_errors(), true);
} else {
    echo "Keine weiteren Ergebnisse vorhanden.\n";
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
Produkte nach dem INSERT: 5: Neues Produkt 4: Anderes Produkt

// Wichtig · Fallstricke

Rückgabewert-Unterschied: null und false haben unterschiedliche Bedeutungen. null bedeutet, es gibt keine weiteren Ergebnisse (normaler Ablauf), während false auf einen echten Fehler hinweist. Vergleiche daher mit === null bzw. === false statt mit lose typisierten Vergleichen, um zwischen diesen Fällen sicher zu unterscheiden.

Nicht verarbeitete Resultsets: Wird ein Resultset nicht vollständig mit sqlsrv_fetch_array o. Ä. abgerufen, bevor sqlsrv_next_result aufgerufen wird, gehen die verbleibenden Zeilen verloren. Dies ist gewollt, kann aber zu unerwartetem Verhalten führen, wenn Zeilen noch benötigt werden.

Ausgabeparameter: Ausgabeparameter einer gespeicherten Prozedur sind erst verfügbar, nachdem alle Resultsets verarbeitet wurden. sqlsrv_next_result muss so oft aufgerufen werden, bis null zurückgegeben wird, bevor auf Ausgabeparameter zugegriffen werden kann.