この機能性は、SQL Server 2008の新しいUser-Defined Table Types(リンク)に基礎を置いている。これにより、ユーザが既知の型としてテーブル定義を登録することができる。テーブルの型は、バッチやストアードプロシー ジャーのボディにおいてローカル変数として使用可能である。SQL Serverの以前のバージョンで利用可能な汎用テーブル変数のstrongly-typedバージョンと同様である。しかしながら、汎用テーブル変数と 異なり、ユーザによって定義されたテーブルの型は、ストアードプロシージャーやパラメータ化TSQL向けのパラメータとしても使用することができる。
![User-defined table type example](http://i37.tinypic.com/be7plx.png)
ユーザ定義のテーブルの型は、以下のように多数の制限がある。
table-valuedパラメータとして使用される場合、ユーザ定義のテーブルの型はさらに制限がある。パラメータ化ステートメントまたはプロシージャーでは読み取り専用である。
- ユーザ定義のテーブルの型は、テーブルでの列またはユーザ定義の型でのフィールドとして使用することができない。
- インデックスがユーザ定義のテーブルの型のPRIMARY KEYやUNIQUE制約の作成結果でない限りは、nonclusteredインデックスはユーザ定義のテーブルの型では作成することができない。
- デフォルト値は、ユーザ定義のテーブルの型の定義では指定することができない。
- ユーザ定義のテーブルの型の定義は、作成後は修正することができない。
- ユーザ定義の機能は、ユーザ定義のテーブルの型の算出欄の定義では呼び出すことができない。
- ユーザ定義のテーブルの型は、ユーザ定義の機能向けの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パラメータにストリームされる。
- 一連の個別のパラメータを使用し、複数のデータの行や列の値を示す。このメソッドによって渡すことが可能なデータ量は、許可されるパラメータ数によって制 限される。SQL Serverプロシージャーは、最大2100のパラメータを持つことができる。サーバ側のロジックは、処理のためにこれらの個別の値をテーブル変数や一時 テーブルにする必要がある。
- 複数のデータ値を区切りストリングやXMLドキュメントにバンドルし、これらのテキスト値をプロシージャーやステートメントに渡す。これには、プロシージャーやステートメントが、データ構造の検証や値のアンバンドルに必要なロジックをインクルードすることが必要である。
- SqlDataAdapterのUpdate メソッドを呼び出すことで作成されるような、複数の行に影響を及ぼすデータ修正用の一連の個別のSQLステートメントを作成する。変更は個別にサーバに対 してサブミットするか、グループにバッチされる。しかしながら、複数のステートメントを含むバッチで実行される場合、各ステートメントはサーバ上で別々に 実行される。
- bcpユーティリティプログラムもしくはSqlBulkCopyオブジェクトを使用して、テーブルに多くのデータの列をロードする。この技法は非常に効率的であるが、データが一時テーブルまたはテーブル変数にロードされない限りは、サーバ側の処理をサポートしていない。
原文はこちらです:http://www.infoq.com/news/2008/08/table-valued-param