SQL 実行タスクにおける結果セットの使用

Integration Services パッケージでは、タスクが使用する SQL コマンドの種類によって、SQL 実行タスクに結果セットが返されるかどうかが決まります。たとえば、通常、SELECT ステートメントは結果セットを返しますが、INSERT ステートメントは返しません。

結果セットに含まれる内容も、SQL コマンドによって異なります。たとえば、SELECT ステートメントからの結果セットに含まれる行数は、0 行、1 行、または多数行である場合があります。ただし、カウントや合計を返す SELECT ステートメントの結果セットに含まれるのは 1 行だけです。

SQL 実行タスクで結果セットを使用すると、SQL コマンドが結果セットを返すかどうかを確認したり、その結果セットの内容を把握するだけでなく、その他の情報も取得できます。SQL 実行タスクで結果セットを正しく使用する際に必要となる、追加の使用要件やガイドラインがあります。以降では、こうした使用要件およびガイドラインについて説明します。

  • 結果セットの種類の指定

  • 結果セットによる変数の設定

  • SQL 実行タスクにおける結果セットの構成

結果セットの種類の指定

SQL 実行タスクでサポートされている結果セットの種類は、次のとおりです。

  • "なし" は、クエリが結果を返さない場合に使用される結果セットです。たとえば、テーブルのレコードを追加、変更、および削除するクエリで使用されます。

  • "単一行" は、クエリが返す行が 1 行のみの場合に使用される結果セットです。たとえば、カウントや合計を返す SELECT ステートメントでこの結果セットが使用されます。

  • "完全な結果セット" は、クエリが複数行を返す場合に使用される結果セットです。たとえば、テーブル内のすべての行を取得する SELECT ステートメントで使用されます。

  • "XML" は、クエリが結果セットを XML 形式で返す場合に使用される結果セットです。たとえば、FOR XML 句が含まれる SELECT ステートメントで使用されます。

SQL 実行タスクが "完全な結果セット" の結果セットを使用し、クエリが複数の行セットを返す場合、タスクは最初の行セットのみを返します。この行セットでエラーが発生すると、タスクはそのエラーをレポートします。他の行セットでエラーが発生しても、タスクはエラーをレポートしません。

接続マネージャーの種類によっては、SQL ステートメントによって返される文字列以外の値が、暗黙的または明示的に文字列に変換される場合があります。ADO 接続マネージャーまたは ODBC 接続マネージャーは、暗黙的に戻り値を文字列に変換します。OLE DB 接続マネージャーは、DBTYPE_I8、DBTYPE_UI8、DBTYPE_NUMERIC、DBTYPE_GUID、DBTYPE_BYTES の各データ型の戻り値を、明示的に文字列に変換します。ただし、ADO.NET 接続マネージャーは戻り値を文字列に変換しません。

結果セットによる変数の設定

結果セットの種類が、単一行、行セット、または XML の場合、クエリが返す結果セットをユーザー定義の変数にバインドできます。

結果セットの種類が "単一行" の場合、列名を結果セットの名前として使用し、返される結果の列を変数にバインドしたり、列一覧の列の序数を結果セットの名前として使用できます。たとえば、クエリ SELECT Color FROM Production.Product WHERE ProductID = ? の結果セットの名前は Color または 0 となります。クエリが複数の列を返す場合に、すべての列の値にアクセスするには、各列を異なる変数にバインドする必要があります。数字を結果セットの名前として使用し、列を変数にマップする場合、その数字はクエリの列一覧に列が表示される順序を示します。たとえば、クエリ SELECT Color, ListPrice, FROM Production.Product WHERE ProductID = ? では、Color 列に 0 を、ListPrice 列に 1 を使用します。列名を結果セットの名前として使用できるかどうかは、タスクの構成で指定されているプロバイダーによって異なります。すべてのプロバイダーで列名が使用できるわけではありません。

単一の値を返す一部のクエリには、列名が含まれないことがあります。たとえば、ステートメント SELECT COUNT (*) FROM Production.Product からは列名が返されません。返される結果にアクセスするには、結果名として序数位置 0 を使用します。列名で返される結果にアクセスするには、列名を指定する AS <alias name> 句をクエリに含める必要があります。ステートメント SELECT COUNT (*)AS CountOfProduct FROM Production.Product では、CountOfProduct 列を指定します。その後、CountOfProduct 列名または序数位置 0 を使用して、返された結果列にアクセスできます。

結果セットの種類が "完全な結果セット" または "XML" の場合、結果セット名には 0 を使用する必要があります。

結果セットの種類が "単一行" の結果セットに変数をマップする場合、変数のデータ型と結果セットに含まれる列のデータ型は互換性がある必要があります。たとえば、String データ型の列を含む結果セットを、数値データ型の変数にマップすることはできません。XML 結果セットをマップできるのは、String または Object データ型の変数のみです。変数が String データ型の場合、SQL 実行タスクは文字列を返し、XML ソースは XML データを使用できます。変数が Object データ型の場合、SQL 実行タスクはドキュメント オブジェクト モデル (DOM) オブジェクトを返します。完全な結果セットは、Object データ型の変数にマップする必要があります。結果は、行セット オブジェクトとして返されます。行セット オブジェクトを参照し、行セット内の列とデータに関する情報にアクセスするカスタム タスクを記述できます。

次の表は、結果セットにマップできる変数のデータ型をまとめたものです。

結果セットの種類

変数のデータ型

オブジェクトの種類

単一行

結果セット内の型列と互換性のあるすべての型

適用なし

完全な結果セット

Object

タスクで ADO、OLE DB、Excel、および ODBC 接続マネージャーを含むネイティブ接続マネージャー使用する場合、返されるオブジェクトは ADO Recordset です。

タスクで ADO.NET 接続マネージャーなどのマネージ接続マネージャーを使用する場合、返されるオブジェクトは System.Data.DataSet です。

XML

String

String

XML

Object

タスクで ADO、OLE DB、Excel、および ODBC 接続マネージャーを含むネイティブ接続マネージャー使用する場合、返されるオブジェクトは MSXML6.IXMLDOMDocument です。

タスクで ADO.NET 接続マネージャーなどのマネージ接続マネージャーを使用する場合、返されるオブジェクトは System.Xml.XmlDocument です。

変数は、SQL 実行タスクまたはパッケージのスコープ内で定義できます。変数にパッケージ スコープがある場合、結果セットはパッケージ内の他のタスクやコンテナーで利用できます。また、パッケージ実行タスクや DTS 2000 パッケージ実行タスクが実行する任意のパッケージでも利用できます。

変数を "単一行" の結果セットにマップすると、SQL ステートメントによって返される、文字列以外の値が、文字列に変換される場合があります。この変換が行われるかどうか、またはこの変換が暗黙的であるか明示的であるかは、使用する接続マネージャーの種類によって決まります。

  • ADO.NET 接続マネージャーを使用した場合、変換は行われません。

  • ADO 接続マネージャーまたは ODBC 接続マネージャーを使用した場合、この変換は暗黙的に行われます。

  • OLE DB 接続マネージャーまたは Excel 接続マネージャーを使用した場合、その接続マネージャーによって、DBTYPE_NUMERIC 型、DBTYPE_GUID 型、および DBTYPE_BYTES 型の値が明示的に文字列に変換されます。

結果セットを変数に読み込む方法の詳細については、「結果セットを SQL 実行タスクの変数にマップする方法」を参照してください。

SQL 実行タスクにおける結果セットの構成

SSIS デザイナーで設定できる、結果セットのプロパティの詳細については、次のトピックを参照してください。

SSIS デザイナーでこれらのプロパティを設定する方法については、次のトピックを参照してください。

外部リソース

Integration Services のアイコン (小) Integration Services に関する最新情報の入手

マイクロソフトが提供する最新のダウンロード、アーティクル、サンプル、ビデオ、およびコミュニティで選択されたソリューションについては、MSDN または TechNet の Integration Services のページを参照してください。

これらの更新が自動で通知されるようにするには、ページの RSS フィードを定期受信します。