Objekt SqlPipe
platí pro:SQL Server
V předchozích verzích SQL Serveru bylo běžné psát uloženou proceduru (nebo rozšířenou uloženou proceduru), která odesílala výsledky nebo výstupní parametry volajícímu klientovi.
V Transact-SQL uložené procedury všechny příkazy SELECT
, které vrátí nula nebo více řádků, odešle výsledky do "kanálu" připojeného volajícího.
Pro databázové objekty CLR (Common Language Runtime) spuštěné v SQL Serveru můžete odesílat výsledky do připojeného kanálu pomocí Send
metod objektu SqlPipe
. Získejte SqlPipe
objektu pomocí Pipe
vlastnosti objektu SqlContext
. Třída SqlPipe
je koncepčně podobná třídě Response
nalezené v ASP.NET.
Další informace naleznete v tématu Microsoft.SqlServer.Server.SqlPipe.
Vrácení tabulkových výsledků a zpráv
Objekt SqlPipe
má Send
metodu, která má tři přetížení. Jsou:
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
Metoda Send
odesílá data přímo klientovi nebo volajícímu. Obvykle je to klient, který spotřebovává výstup z SqlPipe
, ale s vnořenými uloženými procedurami CLR může být výstupní příjemce také uložená procedura. Například Procedure1
volání SqlCommand.ExecuteReader()
s textem příkazu EXEC Procedure2
.
Procedure2
je také spravovaná uložená procedura. Pokud Procedure2
nyní volá SqlPipe.Send(SqlDataRecord)
, řádek se odešle čtenáři v Procedure1
, nikoli klientovi.
Metoda Send
odešle řetězcovou zprávu, která se v klientovi zobrazí jako informační zpráva, která odpovídá PRINT
v jazyce Transact-SQL. Může také odeslat sadu výsledků s jedním řádkem pomocí SqlDataRecord
nebo sady výsledků s více řádky pomocí SqlDataReader
.
Objekt SqlPipe
má také ExecuteAndSend
metodu. Tuto metodu lze použít ke spuštění příkazu (předaného jako objekt SqlCommand
) a odeslání výsledků přímo volajícímu. Pokud v odeslaném příkazu dojde k chybám, výjimky se odešlou do kanálu a kopie se odešle do volání spravovaného kódu. Pokud volající kód výjimku nezachytí, rozšíří zásobník do Transact-SQL kódu a zobrazí se ve výstupu dvakrát. Pokud volající kód zachytí výjimku, příjemce kanálu stále uvidí chybu, ale neexistuje duplicitní chyba.
Může trvat pouze SqlCommand
, která je přidružena k kontextové připojení; nemůže provést příkaz, který je přidružený k připojení, které není kontextové.
Vrácení vlastních sad výsledků
Spravované uložené procedury mohou odesílat sady výsledků, které nepocházejí z SqlDataReader
. Metoda SendResultsStart
spolu s SendResultsRow
a SendResultsEnd
umožňuje uloženým procedurám odesílat do klienta vlastní sady výsledků.
SendResultsStart
jako vstup vezme SqlDataRecord
. Označuje začátek sady výsledků a pomocí metadat záznamu vytvoří metadata, která popisují sadu výsledků. Neodesílá hodnotu záznamu pomocí SendResultsStart
. Všechny následující řádky odeslané pomocí SendResultsRow
musí odpovídat této definici metadat.
Po volání metody SendResultsStart
je možné volat pouze SendResultsRow
a SendResultsEnd
. Volání jakékoli jiné metody ve stejné instanci SqlPipe
způsobí InvalidOperationException
.
SendResultsEnd
nastaví SqlPipe
zpět do počátečního stavu, ve kterém lze volat jiné metody.
Příklad
Uložená procedura uspGetProductLine
vrátí název, číslo výrobku, barvu a ceníkovou cenu všech produktů v zadaném řádku produktu. Tato uložená procedura přijímá přesné shody pro prodLine
.
-
jazyka C#
jazyka C# - visual basic .NET
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.
}
}
}
};
Následující příkaz Transact-SQL spustí uspGetProduct
proceduru, která vrátí seznam cestovních kol.
EXECUTE uspGetProductLineVB 'T';