SqlPipe 物件
適用於:SQL Server
在舊版的 SQL Server 中,通常會撰寫預存程式(或擴充預存程式),以將結果或輸出參數傳送至呼叫用戶端。
在 Transact-SQL 預存程式中,傳回零個或多個數據列的任何 SELECT
語句,會將結果傳送至連接的呼叫端的「管道」。
針對在 SQL Server 中執行的 Common Language Runtime (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 預存程式,輸出取用者也可以是預存程式。 例如,Procedure1
使用命令文字 EXEC Procedure2
呼叫 SqlCommand.ExecuteReader()
。
Procedure2
也是受控預存程式。 如果 Procedure2
現在呼叫 SqlPipe.Send(SqlDataRecord)
,則數據列會在 Procedure1
中傳送給讀取器,而不是用戶端。
Send
方法會傳送字串訊息,該訊息會顯示在用戶端上做為資訊訊息,相當於 Transact-SQL 中的 PRINT
。 它也可以使用 SqlDataRecord
傳送單一數據列結果集,或使用 SqlDataReader
的多數據列結果集。
SqlPipe
物件也有 ExecuteAndSend
方法。 這個方法可以用來執行命令(以 SqlCommand
對象傳遞),並將結果直接傳回給呼叫端。 如果提交命令中有錯誤,例外狀況會傳送至管道,並將複本傳送至呼叫 Managed 程式代碼。 如果呼叫程式代碼未攔截例外狀況,則會將堆疊傳播至 Transact-SQL 程序代碼,並出現在輸出中兩次。 如果呼叫程式代碼確實攔截到例外狀況,管道取用者仍會看到錯誤,但沒有重複的錯誤。
它只能採用與內容連線相關聯的 SqlCommand
;它無法取得與非內容連線相關聯的命令。
傳回自定義結果集
Managed 預存程式可以傳送不是來自 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';