SqlPipe オブジェクト
適用対象: SQL Server
以前のバージョンの SQL Server では、呼び出し元のクライアントに結果または出力パラメーターを送信するストアド プロシージャ (または拡張ストアド プロシージャ) を記述するのが非常に一般的です。
Transact-SQL ストアド プロシージャでは、0 行以上の行を返す SELECT ステートメントは、接続された呼び出し元の "パイプ" に結果を送信します。
SQL Server で実行されている共通言語ランタイム (CLR) データベース オブジェクトの場合、SqlPipe オブジェクトの Send メソッドを使用して、接続されたパイプに結果を送信できます。 SqlContext オブジェクトの Pipe プロパティにアクセスして、SqlPipe オブジェクトを取得します。 SqlPipe クラスは概念的には、ASP.NET にある Response クラスに似ています。 詳細については、.NET Framework Software Development Kit の SqlPipe クラスのリファレンス ドキュメントを参照してください。
表形式の結果とメッセージを返す
SqlPipe には Send メソッドがあり、3 つのオーバーロードがあります。 これらは次のとおりです。
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 メソッド、および SendResultsRow および SendResultsEnd を使用すると、ストアド プロシージャはカスタム結果セットをクライアントに送信できます。
SendResultsStart は、 SqlDataRecord を入力として受け取ります。 さらに、結果セットの先頭にマークを付け、レコード メタデータを使用して、結果セットを説明するメタデータを生成します。 SendResultsStart のレコードの値は送信されません。 SendResultsRow を使用して送信されるすべての後続の行は、そのメタデータ定義と一致する必要があります。
Note
SendResultsStartメソッドを呼び出した後、SendResultsRowとSendResultsEndのみを呼び出すことができます。 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 インプロセス固有の拡張機能