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 デザイナーでこれらのプロパティを設定する方法については、次のトピックを参照してください。
外部リソース
- msftisprodsamples.codeplex.com の CodePlex サンプル「Execute SQL Parameters and Result Sets」
|