分享方式:


SqlPipe 物件

適用於:SQL Server

在舊版 SQL Server 中,撰寫將結果或輸出參數傳送至呼叫用戶端的預存程式(或擴充預存程式)是很常見的。

在 Transact-SQL 預存程式中,傳回零個或多個數據列的任何 SELECT 語句會將結果傳送至連接的呼叫端「管道」。

針對在 SQL Server 中執行的 Common Language Runtime (CLR) 資料庫物件,您可以使用 SqlPipe 物件的 Send 方法,將結果傳送至連接的管道存取 SqlContext 物件的 Pipe 屬性,以取得 SqlPipe 物件。 SqlPipe 類別在概念上類似於 ASP.NET 中找到的 Response 類別。 如需詳細資訊,請參閱 .NET Framework 軟體開發工具包中的 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 方法以及 SendResultsRowSendResultsEnd 可讓預存程式將自定義結果集傳送至用戶端。

SendResultsStart 會採用 SqlDataRecord 做為輸入。 它會標記結果集的開頭,並使用記錄元數據來建構描述結果集的元數據。 它不會使用 SendResultsStart 傳送記錄的值。 使用 SendResultsRow 傳送的所有後續數據列都必須符合該元數據定義。

注意

呼叫 SendResultsStart 方法之後,只能呼叫 SendResultsRowSendResultsEnd。 在相同 SqlPipe 實例中呼叫任何其他方法會導致 InvalidOperationExceptionSendResultsEnd 會將 SqlPipe 設定回可以呼叫其他方法的初始狀態。

範例

uspGetProductLine 預存程式會傳回指定產品線內所有產品的名稱、產品名稱、色彩和清單價格。 此預存程式接受 prodLine 的完全相符專案。

C#

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.  
        }  
     }  
}  
};  

Visual Basic

Imports System  
Imports System.Data  
Imports System.Data.SqlClient  
Imports System.Data.SqlTypes  
Imports Microsoft.SqlServer.Server  
  
Partial Public Class StoredProcedures  
<Microsoft.SqlServer.Server.SqlProcedure()> _  
Public Shared Sub uspGetProductLine(ByVal prodLine As SqlString)  
    Dim command As SqlCommand  
  
    ' Connect through the context connection.  
    Using connection As New SqlConnection("context connection=true")  
        connection.Open()  
  
        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   
            ' directly to the caller.  
            SqlContext.Pipe.ExecuteAndSend(command)  
        Catch ex As System.Data.SqlClient.SqlException  
            ' An error occurred executing the SQL command.  
        End Try  
    End Using  
End Sub  
End Class  

下列 Transact-SQL 語句會 執行 uspGetProduct 程式,此程式會傳回導覽自行車產品的清單。

EXEC uspGetProductLineVB 'T';  

另請參閱

SqlDataRecord 物件
CLR 預存程序
ADO.NET 的 SQL Server 同處理序特定擴充