Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Powoduje, że następny wynik (zestaw wyników, liczba wierszy lub parametr wyjściowy) określonej instrukcji jest aktywny.
Uwaga / Notatka
Pierwszy (lub tylko) wynik zwracany przez zapytanie wsadowe lub procedurę składowaną jest aktywny bez wywołania sqlsrv_next_result.
Składnia
sqlsrv_next_result( resource $stmt )
Parametry
$stmt: wykonywana instrukcja, na której jest aktywny następny wynik.
Wartość zwracana
Jeśli następny wynik został pomyślnie aktywowany, zwracana jest wartość logiczna true . Jeśli wystąpił błąd podczas aktywnego następnego wyniku, zwracana jest wartość false . Jeśli więcej wyników nie jest dostępnych, zwracana jest wartość null .
Przykład 1
Poniższy przykład tworzy i wykonuje procedurę składowaną, która wstawia przegląd produktu do tabeli Production.ProductReview , a następnie wybiera wszystkie recenzje określonego produktu. Po wykonaniu procedury składowanej pierwszy wynik (liczba wierszy, których dotyczy zapytanie INSERT w procedurze składowanej), jest używany bez wywoływania sqlsrv_next_result. Następny wynik (wiersze zwrócone przez zapytanie SELECT w procedurze składowanej) są udostępniane przez wywołanie sqlsrv_next_result i użycie przy użyciu sqlsrv_fetch_array.
Uwaga / Notatka
Zalecane jest wywoływanie procedur składowanych przy użyciu składni kanonicznej. Aby uzyskać więcej informacji na temat składni kanonicznej, zobacz Wywoływanie procedury składowanej.
W tym przykładzie przyjęto założenie, że na komputerze lokalnym zainstalowano program SQL Server i bazę danych AdventureWorks . Wszystkie dane wyjściowe są zapisywane w konsoli, gdy przykład jest uruchamiany z wiersza polecenia.
<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
echo "Could not connect.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Drop the stored procedure if it already exists. */
$tsql_dropSP = "IF OBJECT_ID('InsertProductReview', 'P') IS NOT NULL
DROP PROCEDURE InsertProductReview";
$stmt1 = sqlsrv_query( $conn, $tsql_dropSP);
if( $stmt1 === false )
{
echo "Error in executing statement 1.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Create the stored procedure. */
$tsql_createSP = " CREATE PROCEDURE InsertProductReview
@ProductID int,
@ReviewerName nvarchar(50),
@ReviewDate datetime,
@EmailAddress nvarchar(50),
@Rating int,
@Comments nvarchar(3850)
AS
BEGIN
INSERT INTO Production.ProductReview
(ProductID,
ReviewerName,
ReviewDate,
EmailAddress,
Rating,
Comments)
VALUES
(@ProductID,
@ReviewerName,
@ReviewDate,
@EmailAddress,
@Rating,
@Comments);
SELECT * FROM Production.ProductReview
WHERE ProductID = @ProductID;
END";
$stmt2 = sqlsrv_query( $conn, $tsql_createSP);
if( $stmt2 === false)
{
echo "Error in executing statement 2.\n";
die( print_r( sqlsrv_errors(), true));
}
/*-------- The next few steps call the stored procedure. --------*/
/* Define the Transact-SQL query. Use question marks (?) in place of the
parameters to be passed to the stored procedure */
$tsql_callSP = "{call InsertProductReview(?, ?, ?, ?, ?, ?)}";
/* Define the parameter array. */
$productID = 709;
$reviewerName = "Customer Name";
$reviewDate = "2008-02-12";
$emailAddress = "customer@email.com";
$rating = 3;
$comments = "[Insert comments here.]";
$params = array(
$productID,
$reviewerName,
$reviewDate,
$emailAddress,
$rating,
$comments
);
/* Execute the query. */
$stmt3 = sqlsrv_query( $conn, $tsql_callSP, $params);
if( $stmt3 === false)
{
echo "Error in executing statement 3.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Consume the first result (rows affected by INSERT query in the
stored procedure) without calling sqlsrv_next_result. */
echo "Rows affected: ".sqlsrv_rows_affected($stmt3)."-----\n";
/* Move to the next result and display results. */
$next_result = sqlsrv_next_result($stmt3);
if( $next_result )
{
echo "\nReview information for product ID ".$productID.".---\n";
while( $row = sqlsrv_fetch_array( $stmt3, SQLSRV_FETCH_ASSOC))
{
echo "ReviewerName: ".$row['ReviewerName']."\n";
echo "ReviewDate: ".date_format($row['ReviewDate'],
"M j, Y")."\n";
echo "EmailAddress: ".$row['EmailAddress']."\n";
echo "Rating: ".$row['Rating']."\n\n";
}
}
elseif( is_null($next_result))
{
echo "No more results.\n";
}
else
{
echo "Error in moving to next result.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt1 );
sqlsrv_free_stmt( $stmt2 );
sqlsrv_free_stmt( $stmt3 );
sqlsrv_close( $conn );
?>
Podczas wykonywania procedury składowanej zawierającej parametry wyjściowe zaleca się użycie wszystkich innych wyników przed uzyskaniem dostępu do wartości parametrów wyjściowych. Aby uzyskać więcej informacji , zobacz How to: Specify Parameter Direction Using the SQLSRV Driver (Instrukcje: określanie kierunku parametru przy użyciu sterownika SQLSRV).
Przykład 2
Poniższy przykład wykonuje zapytanie wsadowe, które pobiera informacje o przeglądzie produktu dla określonego identyfikatora produktu, wstawia przegląd produktu, a następnie ponownie pobiera informacje o przeglądzie produktu dla określonego identyfikatora produktu. Nowo wstawiony przegląd produktu zostanie uwzględniony w końcowym zestawie wyników zapytania wsadowego. W przykładzie użyto sqlsrv_next_result , aby przejść z jednego wyniku zapytania wsadowego do następnego.
Uwaga / Notatka
Pierwszy (lub tylko) wynik zwracany przez zapytanie wsadowe lub procedurę składowaną jest aktywny bez wywołania sqlsrv_next_result.
W przykładzie użyto tabeli Purchasing.ProductReview bazy danych AdventureWorks i przyjęto założenie, że ta baza danych jest zainstalowana na serwerze. Wszystkie dane wyjściowe są zapisywane w konsoli, gdy przykład jest uruchamiany z wiersza polecenia.
<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
echo "Could not connect.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Define the batch query. */
$tsql = "--Query 1
SELECT ProductID, ReviewerName, Rating
FROM Production.ProductReview
WHERE ProductID=?;
--Query 2
INSERT INTO Production.ProductReview (ProductID,
ReviewerName,
ReviewDate,
EmailAddress,
Rating)
VALUES (?, ?, ?, ?, ?);
--Query 3
SELECT ProductID, ReviewerName, Rating
FROM Production.ProductReview
WHERE ProductID=?;";
/* Assign parameter values and execute the query. */
$params = array(798,
798,
'CustomerName',
'2008-4-15',
'test@customer.com',
3,
798 );
$stmt = sqlsrv_query($conn, $tsql, $params);
if( $stmt === false )
{
echo "Error in statement execution.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Retrieve and display the first result. */
echo "Query 1 result:\n";
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC ))
{
print_r($row);
}
/* Move to the next result of the batch query. */
sqlsrv_next_result($stmt);
/* Display the result of the second query. */
echo "Query 2 result:\n";
echo "Rows Affected: ".sqlsrv_rows_affected($stmt)."\n";
/* Move to the next result of the batch query. */
sqlsrv_next_result($stmt);
/* Retrieve and display the third result. */
echo "Query 3 result:\n";
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC ))
{
print_r($row);
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>
Zobacz też
dokumentacja referencyjna interfejsu API sterownika SQLSRV
O przykładach kodu w dokumentacji
Aktualizowanie danych (sterowniki firmy Microsoft dla języka PHP dla programu SQL Server)
przykładowa aplikacja (sterownik SQLSRV)