SqlPipe 对象
适用范围:SQL Server
在早期版本的 SQL Server 中,通常编写将结果或输出参数发送到调用客户端的存储过程(或扩展存储过程)。
在 Transact-SQL 存储过程中,返回零行或更多行的任何 SELECT
语句将结果发送到连接的调用方“管道”。
对于在 SQL Server 中运行的公共语言运行时(CLR)数据库对象,可以使用 SqlPipe
对象的 Send
方法将结果发送到连接的管道。 访问 SqlContext
对象的 Pipe
属性以获取 SqlPipe
对象。
SqlPipe
类在概念上类似于在 ASP.NET 中找到的 Response
类。
有关详细信息,请参阅 Microsoft.SqlServer.Server.SqlPipe。
返回表格结果和消息
SqlPipe
对象具有一个具有三个重载的 Send
方法。 它们是:
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
Send
方法将数据直接发送到客户端或调用方。 它通常是使用 SqlPipe
输出的客户端,但使用嵌套 CLR 存储过程时,输出使用者也可以是存储过程。 例如,使用命令文本 EXEC Procedure2
Procedure1
调用 SqlCommand.ExecuteReader()
。
Procedure2
也是托管存储过程。 如果 Procedure2
现在调用 SqlPipe.Send(SqlDataRecord)
,则行将发送到 Procedure1
中的读取器,而不是客户端。
Send
方法发送一条字符串消息,该消息在客户端上显示为信息消息,等效于 Transact-SQL 中的 PRINT
。 它还可以使用 SqlDataRecord
发送单行结果集,也可以使用 SqlDataReader
发送多行结果集。
SqlPipe
对象还具有 ExecuteAndSend
方法。 此方法可用于执行命令(作为 SqlCommand
对象传递),并将结果直接发送回调用方。 如果提交命令中存在错误,则会将异常发送到管道,并将副本发送到调用托管代码。 如果调用代码未捕获异常,它将堆栈向上传播到 Transact-SQL 代码,并在输出中显示两次。 如果调用代码确实捕获了异常,管道使用者仍会看到错误,但没有重复的错误。
它只能采用与上下文连接关联的 SqlCommand
;它不能采用与非上下文连接关联的命令。
返回自定义结果集
托管存储过程可以发送不来自 SqlDataReader
的结果集。
SendResultsStart
方法以及 SendResultsRow
和 SendResultsEnd
允许存储过程将自定义结果集发送到客户端。
SendResultsStart
采用 SqlDataRecord
作为输入。 该方法标记结果集的开始,并使用记录元数据构造描述结果集的元数据。 它不会使用 SendResultsStart
发送记录的值。 使用 SendResultsRow
发送的所有后续行必须与该元数据定义匹配。
调用 SendResultsStart
方法后,只能调用 SendResultsRow
和 SendResultsEnd
。 在同一 SqlPipe
实例中调用任何其他方法会导致 InvalidOperationException
。
SendResultsEnd
将 SqlPipe
设置回可以调用其他方法的初始状态。
示例
uspGetProductLine
存储过程返回指定生产线中所有产品的名称、产品名称、颜色和标价。 此存储过程接受 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.
}
}
}
};
以下 Transact-SQL 语句执行 uspGetProduct
过程,该过程返回旅游自行车产品列表。
EXECUTE uspGetProductLineVB 'T';