Compartir a través de


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 SqlDataRecordo 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.

  • de C#
  • de Visual Basic para .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.
        }
     }
}
};

La siguiente instrucción Transact-SQL ejecuta el procedimiento uspGetProduct, que devuelve una lista de productos de bicicletas de paseo.

EXECUTE uspGetProductLineVB 'T';