Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:programu SQL Server
W poprzednich wersjach programu SQL Server często było pisać procedurę składowaną (lub rozszerzoną procedurę składowaną), która wysyłała wyniki lub parametry wyjściowe do wywołującego klienta.
W procedurze składowanej Transact-SQL każda instrukcja SELECT zwracająca zero lub więcej wierszy wysyła wyniki do "potoku" połączonego wywołującego.
W przypadku obiektów bazy danych środowiska uruchomieniowego języka wspólnego (CLR) uruchomionych w programie SQL Server można wysyłać wyniki do połączonego potoku przy użyciu metod Send obiektu SqlPipe. Uzyskaj dostęp do właściwości Pipe obiektu SqlContext w celu uzyskania obiektu SqlPipe. Klasa SqlPipe jest koncepcyjnie podobna do klasy Response znalezionej w ASP.NET.
Aby uzyskać więcej informacji, zobacz Microsoft.SqlServer.Server.SqlPipe.
Zwracanie wyników tabelarycznych i komunikatów
Obiekt SqlPipe ma metodę Send, która ma trzy przeciążenia. Są to:
void Send(string message)void Send(SqlDataReader reader)void Send(SqlDataRecord record)
Metoda Send wysyła dane bezpośrednio do klienta lub obiektu wywołującego. Zazwyczaj klient korzysta z danych wyjściowych z SqlPipe, ale w przypadku zagnieżdżonych procedur składowanych CLR odbiorca danych wyjściowych może być również procedurą składowaną. Na przykład Procedure1 wywołuje SqlCommand.ExecuteReader() z tekstem polecenia EXEC Procedure2.
Procedure2 jest również zarządzaną procedurą składowaną. Jeśli Procedure2 teraz wywołuje SqlPipe.Send(SqlDataRecord), wiersz jest wysyłany do czytnika w Procedure1, a nie do klienta.
Metoda Send wysyła komunikat ciągu wyświetlany na kliencie jako komunikat informacyjny, odpowiadający PRINT w języku Transact-SQL. Może również wysyłać zestaw wyników z jednym wierszem przy użyciu SqlDataRecordlub zestawu wyników z wieloma wierszami przy użyciu SqlDataReader.
Obiekt SqlPipe ma również metodę ExecuteAndSend. Ta metoda może służyć do wykonywania polecenia (przekazanego jako obiekt SqlCommand) i wysyłania wyników bezpośrednio do obiektu wywołującego. Jeśli w przesłaniu polecenia występują błędy, wyjątki są wysyłane do potoku, a kopia jest wysyłana do wywoływania kodu zarządzanego. Jeśli kod wywołujący nie przechwyci wyjątku, propaguje stos do kodu Transact-SQL i pojawia się w danych wyjściowych dwa razy. Jeśli kod wywołujący przechwyci wyjątek, odbiorca potoku nadal widzi błąd, ale nie ma zduplikowanego błędu.
Może to przyjmować tylko SqlCommand skojarzone z połączeniem kontekstowym; nie może podjąć polecenia skojarzonego z połączeniem niezwiązanym z kontekstem.
Zwracanie niestandardowych zestawów wyników
Zarządzane procedury składowane mogą wysyłać zestawy wyników, które nie pochodzą z SqlDataReader. Metoda SendResultsStart, wraz z SendResultsRow i SendResultsEnd, umożliwia procedurom składowanych wysyłanie niestandardowych zestawów wyników do klienta.
SendResultsStart przyjmuje SqlDataRecord jako dane wejściowe. Oznacza początek zestawu wyników i używa metadanych rekordu do konstruowania metadanych opisujących zestaw wyników. Nie wysyła ona wartości rekordu z SendResultsStart. Wszystkie kolejne wiersze wysyłane przy użyciu SendResultsRowmuszą być zgodne z definicją metadanych.
Po wywołaniu metody SendResultsStart można wywołać tylko SendResultsRow i SendResultsEnd. Wywołanie dowolnej innej metody w tym samym wystąpieniu SqlPipe powoduje InvalidOperationException.
SendResultsEnd ustawia SqlPipe z powrotem do stanu początkowego, w którym można wywołać inne metody.
Przykład
Procedura składowana uspGetProductLine zwraca nazwę, numer produktu, kolor i cenę katalogową wszystkich produktów w ramach określonej linii produktu. Ta procedura składowana akceptuje dokładne dopasowania dla prodLine.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void uspGetProductLine(SqlString prodLine)
{
// Connect through the context connection.
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand(
"SELECT Name, ProductNumber, Color, ListPrice " +
"FROM Production.Product " +
"WHERE ProductLine = @prodLine;", connection);
command.Parameters.AddWithValue("@prodLine", prodLine);
try
{
// Execute the command and send the results to the caller.
SqlContext.Pipe.ExecuteAndSend(command);
}
catch (System.Data.SqlClient.SqlException ex)
{
// An error occurred executing the SQL command.
}
}
}
};
Poniższa instrukcja Transact-SQL wykonuje procedurę uspGetProduct, która zwraca listę produktów rowerów turystycznych.
EXECUTE uspGetProductLineVB 'T';
Powiązana zawartość
- obiektu
SqlDataRecord - procedur składowanych CLR
- rozszerzenia specyficzne dla programu SQL Server do ADO.NET