Objeto SqlPipe
Se aplica a:SQL Server
En versiones anteriores de SQL Server, era habitual escribir un procedimiento almacenado (o un procedimiento almacenado extendido) que envió resultados o parámetros de salida al cliente que realiza la llamada.
En un procedimiento almacenado Transact-SQL, cualquier instrucción SELECT
que devuelva cero o más filas envía los resultados a la "canalización" del autor de la llamada conectada.
En el caso de los objetos de base de datos de Common Language Runtime (CLR) que se ejecutan en SQL Server, puede enviar resultados a la canalización conectada mediante los métodos Send
del objeto SqlPipe
. Obtenga acceso a la propiedad Pipe
del objeto SqlContext
para obtener el objeto SqlPipe
. La clase SqlPipe
es conceptualmente similar a la clase Response
que se encuentra en ASP.NET.
Para obtener más información, vea Microsoft.SqlServer.Server.SqlPipe.
Devolver resultados tabulares y mensajes
El objeto SqlPipe
tiene un método Send
, que tiene tres sobrecargas. Son las siguientes:
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
El método Send
envía datos directamente al cliente o al autor de la llamada. Normalmente es el cliente que consume la salida de la SqlPipe
, pero con procedimientos almacenados CLR anidados, el consumidor de salida también puede ser un procedimiento almacenado. Por ejemplo, Procedure1
llama a SqlCommand.ExecuteReader()
con el texto del comando EXEC Procedure2
.
Procedure2
también es un procedimiento almacenado administrado. Si ahora Procedure2
llama a SqlPipe.Send(SqlDataRecord)
, la fila se envía al lector en Procedure1
, no al cliente.
El método Send
envía un mensaje de cadena que aparece en el cliente como un mensaje de información, equivalente a PRINT
en Transact-SQL. También puede enviar un conjunto de resultados de una sola fila mediante SqlDataRecord
o un conjunto de resultados de varias filas mediante un SqlDataReader
.
El objeto SqlPipe
también tiene un método ExecuteAndSend
. Este método se puede usar para ejecutar un comando (pasado como un objeto SqlCommand
) y enviar resultados directamente al autor de la llamada. Si hay errores en el comando enviado, las excepciones se envían a la canalización y se envía una copia al código administrado. Si el código de llamada no detecta la excepción, propaga la pila al código de Transact-SQL y aparece en la salida dos veces. Si el código de llamada detecta la excepción, el consumidor de canalización sigue viendo el error, pero no hay un error duplicado.
Solo puede tomar un SqlCommand
asociado a la conexión de contexto; no puede tomar un comando asociado a la conexión que no es de contexto.
Devolver conjuntos de resultados personalizados
Los procedimientos almacenados administrados pueden enviar conjuntos de resultados que no proceden de un SqlDataReader
. El método SendResultsStart
, junto con SendResultsRow
y SendResultsEnd
, permite que los procedimientos almacenados envíen conjuntos de resultados personalizados al cliente.
SendResultsStart
toma un SqlDataRecord
como entrada. Este método marca el principio de un conjunto de resultados y utiliza los metadatos del registro para generar los metadatos que describen el conjunto de resultados. No envía el valor del registro con SendResultsStart
. Todas las filas posteriores, enviadas mediante SendResultsRow
, deben coincidir con esa definición de metadatos.
Después de llamar al método SendResultsStart
, solo se puede llamar a SendResultsRow
y SendResultsEnd
. Llamar a cualquier otro método de la misma instancia de SqlPipe
provoca un InvalidOperationException
.
SendResultsEnd
establece SqlPipe
al estado inicial en el que se puede llamar a otros métodos.
Ejemplo
El procedimiento almacenado uspGetProductLine
devuelve el nombre, el número de producto, el color y el precio de lista de todos los productos dentro de una línea de producto especificada. Este procedimiento almacenado acepta coincidencias exactas para 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.
}
}
}
};
La siguiente instrucción Transact-SQL ejecuta el procedimiento uspGetProduct
, que devuelve una lista de productos de bicicletas de paseo.
EXECUTE uspGetProductLineVB 'T';