BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース SQL ServerにおけるTable-Valuedパラメータ

SQL ServerにおけるTable-Valuedパラメータ

Table-valuedパラメータ(リンク)は、SQL Server 2008に導入された新しい機能である。クライアントアプリケーションから単一のパラメータ化SQLステートメントのSQL Serverへ複数のデータ行を送信するための、標準装備された手段を提供する。

この機能性は、SQL Server 2008の新しいUser-Defined Table Types(リンク)に基礎を置いている。これにより、ユーザが既知の型としてテーブル定義を登録することができる。テーブルの型は、バッチやストアードプロシー ジャーのボディにおいてローカル変数として使用可能である。SQL Serverの以前のバージョンで利用可能な汎用テーブル変数のstrongly-typedバージョンと同様である。しかしながら、汎用テーブル変数と 異なり、ユーザによって定義されたテーブルの型は、ストアードプロシージャーやパラメータ化TSQL向けのパラメータとしても使用することができる。

User-defined table type example

ユーザ定義のテーブルの型は、以下のように多数の制限がある。

  • ユーザ定義のテーブルの型は、テーブルでの列またはユーザ定義の型でのフィールドとして使用することができない。
  • インデックスがユーザ定義のテーブルの型のPRIMARY KEYやUNIQUE制約の作成結果でない限りは、nonclusteredインデックスはユーザ定義のテーブルの型では作成することができない。
  • デフォルト値は、ユーザ定義のテーブルの型の定義では指定することができない。
  • ユーザ定義のテーブルの型の定義は、作成後は修正することができない。
  • ユーザ定義の機能は、ユーザ定義のテーブルの型の算出欄の定義では呼び出すことができない。
  • ユーザ定義のテーブルの型は、ユーザ定義の機能向けのtable-valuedパラメータとして使用することができない。
table-valuedパラメータとして使用される場合、ユーザ定義のテーブルの型はさらに制限がある。パラメータ化ステートメントまたはプロシージャーでは読み取り専用である。
table-valuedパラメーターの行では、列の値をアップデートできない。行の挿入や削除もできない。table-valuedパラメータのスト アードプロシージャーやパラメータ化ステートメントに渡されるデータを修正するためには、一時テーブルもしくはテーブル変数にデータを挿入しなければなら ない。
ユーザ定義のテーブルの型は、標準的な以下のSqlParameter型を使用することで、ADO.NETで使用することができる。
  • パラメータのTypeNameは、ユーザ定義のテーブルの型の名前に設定される必要がある。たとえば、「dbo.PersonInfo」。
  • SqlDbTypeは、SqldbType.Structuredに設定される必要がある。
  • パラメータの値は、ユーザ定義のデータの型と一致するデータを表す必要がある。System.Data.SqlClientは、System.Data.DataTableまたはIListからtable-valuedパラメータをサポートする。また、System.Data.Common.DbDataReaderまたはOracleDataReaderなどの派生クラスを使用し、データの列はtable-valuedパラメータにストリームされる。
table-valuedパラメータ以前は、デベロッパはこの機能を模倣するためのオプションがあった。
  • 一連の個別のパラメータを使用し、複数のデータの行や列の値を示す。このメソッドによって渡すことが可能なデータ量は、許可されるパラメータ数によって制 限される。SQL Serverプロシージャーは、最大2100のパラメータを持つことができる。サーバ側のロジックは、処理のためにこれらの個別の値をテーブル変数や一時 テーブルにする必要がある。
  • 複数のデータ値を区切りストリングやXMLドキュメントにバンドルし、これらのテキスト値をプロシージャーやステートメントに渡す。これには、プロシージャーやステートメントが、データ構造の検証や値のアンバンドルに必要なロジックをインクルードすることが必要である。
  • SqlDataAdapterのUpdate メソッドを呼び出すことで作成されるような、複数の行に影響を及ぼすデータ修正用の一連の個別のSQLステートメントを作成する。変更は個別にサーバに対 してサブミットするか、グループにバッチされる。しかしながら、複数のステートメントを含むバッチで実行される場合、各ステートメントはサーバ上で別々に 実行される。
  • bcpユーティリティプログラムもしくはSqlBulkCopyオブジェクトを使用して、テーブルに多くのデータの列をロードする。この技法は非常に効率的であるが、データが一時テーブルまたはテーブル変数にロードされない限りは、サーバ側の処理をサポートしていない。

原文はこちらです:http://www.infoq.com/news/2008/08/table-valued-param

この記事に星をつける

おすすめ度
スタイル

BT