次の方法で共有


SqlPipe オブジェクト

前のバージョンの SQL Server では、結果や出力パラメーターを呼び出し元クライアントへ送信するストアド プロシージャ (または拡張ストアド プロシージャ) を作成するのが一般的でした。

Transact-SQL ストアド プロシージャでは、0 行以上の行を返すステートメントは SELECT 、接続された呼び出し元の "パイプ" に結果を送信します。

SQL Serverで実行されている共通言語ランタイム (CLR) データベース オブジェクトの場合は、 オブジェクトの メソッドを使用して接続されたパイプにSend結果をSqlPipe送信できます。 Pipe オブジェクトを取得するには、SqlContext オブジェクトの SqlPipe プロパティにアクセスします。 SqlPipe クラスは、概念的には ASP.NET の Response クラスに似ています。 詳細については、.NET Framework Software Development Kit の SqlPipe クラスのリファレンス ドキュメントを参照してください。

表形式の結果とメッセージを返す

SqlPipe には、3 つのオーバーロードを持つ 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 オブジェクトで渡された) コマンドを実行し、その結果を直接呼び出し側に返送するために使用できます。 送信されたコマンドにエラーがある場合、パイプに例外が送信されますが、呼び出し元のマネージド コードにもコピーが送信されます。 呼び出し元のコードが例外をキャッチしない場合、スタックが Transact-SQL コードに伝達され、出力に 2 回表示されます。 呼び出し元コードが例外をキャッチした場合、パイプ コンシューマーにはまだエラーが表示されますが、重複するエラーはありません。

このメソッドは、コンテキスト接続に関連付けられた SqlCommand だけを受け取ります。コンテキスト接続以外に関連付けられたコマンドを受け取ることはできません。

カスタム結果セットを返す

マネージド ストアド プロシージャでは、SqlDataReader 以外からの結果セットを送信できます。 SendResultsStart メソッドでは、SendResultsRowSendResultsEnd と同様に、ストアド プロシージャからクライアントにカスタム結果セットを送信できます。

SendResultsStart は、SqlDataRecord を入力として受け取ります。 さらに、結果セットの先頭にマークを付け、レコード メタデータを使用して、結果セットを説明するメタデータを生成します。 SendResultsStart を使ってレコードの値が送信されることはありません。 以降、SendResultsRow を使用して送信されるすべての行は、そのメタデータ定義に一致する必要があります。

注意

SendResultsStart メソッドを呼び出した後に呼び出せるのは、SendResultsRowSendResultsEnd のみです。 SqlPipe の同じインスタンスで他のどのメソッドを呼び出しても、InvalidOperationException が発生することになります。 SendResultsEnd は、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 インプロセス固有の拡張機能