ユーザー定義型の使用
SQL Server 2005 で導入されたユーザー定義型 (UDT) により、SQL Server データベースにオブジェクトやカスタム データ構造を格納できるようになり、SQL の型システムが拡張されます。UDT は複数のデータ型を保持でき、動作を含むことができるので、1 つの SQL Server システム データ型だけで構成される従来の別名データ型とは異なります。UDT は、検証可能なコードを生成する .NET 共通言語ランタイム (CLR) でサポートされる任意の言語を使用して定義されます。このような言語には、Microsoft Visual C#® や Visual Basic® .NET があります。データは、.NET のクラスまたは構造体のフィールドやプロパティとして公開され、動作はクラスまたは構造体のメソッドによって定義されます。
SQL Server 2005 では、UDT はテーブルの列定義、Transact-SQL バッチの変数、または Transact-SQL 関数やストアド プロシージャの引数として使用することができます。UDT の詳細については、「CLR ユーザー定義型の使用」を参照してください。
SQL Native Client OLE DB プロバイダ
SQL Native Client OLE DB プロバイダでは、UDT はメタデータ情報を持つバイナリ型としてサポートされるので、オブジェクトとして管理できます。UDT 列は、DBTYPE_UDT 型として公開され、この列のメタデータは主要な OLE DB インターフェイスの IColumnRowset と新しいインターフェイスの ISSCommandWithParameters により公開されます。
メモ : |
---|
IRowsetFind::FindNextRow メソッドでは、UDT データ型を処理できません。UDT が検索列の型として使用されると、DB_E_BADCOMPAREOP が返されます。 |
データ バインドと強制型変換
次の表に、特定のデータ型を SQL Server の UDT と共に使用した場合に行われるバインドおよび強制型変換を示します。UDT 列は、SQL Native Client OLE DB プロバイダにより DBTYPE_UDT 型として公開されます。この列のメタデータは、適切なスキーマ行セットを使用して取得できるので、独自に定義した型をオブジェクトとして管理できます。
データ型 | SQL Server の UDT | SQL Server の UDT 以外 | SQL Server の UDT から | SQL Server の UDT 以外から |
---|---|---|---|---|
DBTYPE_UDT |
サポートされています6 |
エラー1 |
サポートされています6 |
エラー8 |
DBTYPE_BYTES |
サポートされています6 |
N/A2 |
サポートされています6 |
N/A2 |
DBTYPE_WSTR |
サポートされています3、6 |
N/A2 |
サポートされています4、6 |
N/A2 |
DBTYPE_BSTR |
サポートされています3、6 |
N/A2 |
サポートされています4 |
N/A2 |
DBTYPE_STR |
サポートされています3、6 |
N/A2 |
サポートされています4、6 |
N/A2 |
DBTYPE_IUNKNOWN |
サポートされていません |
N/A2 |
サポートされていません |
N/A2 |
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) |
サポートされています6 |
N/A2 |
サポートされています4 |
N/A2 |
DBTYPE_VARIANT (VT_BSTR) |
サポートされています3、6 |
N/A2 |
N/A |
N/A2 |
1ICommandWithParameters::SetParameterInfo メソッドで DBTYPE_UDT 以外のデータ型が指定され、アクセサの型が DBTYPE_UDT の場合、ステートメントの実行時にエラー (DB_E_ERRORSOCCURRED) が発生します (パラメータの状態は DBSTATUS_E_BADACCESSOR になります)。それ以外の場合、データはサーバーに送信されますが、サーバーからは、UDT がパラメータのデータ型に暗黙的に変換されないことを示すエラーが返されます。
2このトピックでの説明の対象外です。
316 進文字列からバイナリ データへのデータ変換が行われます。
4バイナリ データから 16 進文字列へのデータ変換が行われます。
5アクセサの作成時またはフェッチ時に検証が行われることがあります。エラー DB_E_ERRORSOCCURRED が返され、バインドの状態は DBBINDSTATUS_UNSUPPORTEDCONVERSION になります。
6BY_REF を使用できます。
DBTYPE_NULL と DBTYPE_EMPTY は入力パラメータにバインドできますが、出力パラメータや結果にはバインドできません。入力パラメータにバインドした場合、状態を DBSTATUS_S_ISNULL または DBSTATUS_S_DEFAULT に設定する必要があります。
DBTYPE_UDT 型は、DBTYPE_EMPTY と DBTYPE_NULL に変換できますが、DBTYPE_EMPTY と DBTYPE_NULL は DBTYPE_UDT に変換できません。この動作は、DBTYPE_BYTES 型と一貫性があります。
メモ : |
---|
UDT をパラメータとして処理するための新しいインターフェイス ISSCommandWithParameters が導入されました。これは、ICommandWithParameters インターフェイスから継承されます。アプリケーションでは、少なくとも UDT パラメータの SSPROP_PARAM_UDT_NAME プロパティ セットの DBPROPSET_SQLSERVERPARAMETER プロパティの設定に、このインターフェイスを使用する必要があります。これを行わないと、ICommand::Execute メソッドから DB_E_ERRORSOCCURRED が返されます。このインターフェイスとプロパティ セットについては、このトピックの後半で説明します。 |
データを格納できる大きさがない列にユーザー定義型を挿入した場合、ICommand::Execute は状態が DB_E_ERRORSOCCURRED の S_OK を返します。
OLE DB Core Services で提供されるデータ変換 (IDataConvert) は、DBTYPE_UDT 型には適用できません。また、その他のバインドもサポートされません。
OLE DB 行セットに関する追加事項と変更事項
SQL Native Client では、多くの主要な OLE DB スキーマ行セットに新しい値が追加され、変更が加えられました。
PROCEDURE_PARAMETERS スキーマ行セット
PROCEDURE_PARAMETERS スキーマ行セットには、次の列が追加されました。
列名 | データ型 | 説明 |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
3 部構成の名前の識別子。 |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
3 部構成の名前の識別子。 |
SS_UDT_NAME |
DBTYPE_WSTR |
3 部構成の名前の識別子。 |
SS_UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
型名と、CLR での参照に必要なすべてのアセンブリ ID を含むアセンブリ修飾名。 |
SQL_ASSEMBLIES スキーマ行セット
SQL Native Client OLE DB プロバイダは、登録済みの UDT に関する情報が格納される、プロバイダ固有の新しいスキーマ行セットを公開します。ASSEMBLY_SERVER を DBTYPE_WSTR 型として指定することはできますが、行セットには格納されません。指定しない場合、行セットでは既定で現在のサーバーが使用されます。次の表に、SQL_ASSEMBLIES スキーマ行セットの定義を示します。
列名 | データ型 | 説明 |
---|---|---|
ASSEMBLY_CATALOG |
DBTYPE_WSTR |
このデータ型を含むアセンブリのカタログ名。 |
ASSEMBLY_SCHEMA |
DBTYPE_WSTR |
このデータ型を含むアセンブリのスキーマ名 (所有者の名前)。アセンブリのスコープはスキーマではなくデータベースによって決まりますが、アセンブリには依然として所有者が存在します。 |
ASSEMBLY_NAME |
DBTYPE_WSTR |
このデータ型を含むアセンブリの名前。 |
ASSEMBLY_ID |
DBTYPE_UI4 |
このデータ型を含むアセンブリのオブジェクト ID。 |
PERMISSION_SET |
DBTYPE_WSTR |
アセンブリのアクセスのスコープを示す値。スコープを示す値には、"SAFE"、"EXTERNAL_ACCESS"、および "UNSAFE" があります。 |
ASSEMBLY_BINARY |
DBTYPE_BYTES |
アセンブリのバイナリ表記。 |
SQL_ASSEMBLIES_ DEPENDENCIES スキーマ行セット
SQL Native Client OLE DB プロバイダでは、特定のサーバーにおけるアセンブリの依存関係に関する情報が格納される、プロバイダ固有の新しいスキーマ行セットを公開します。ASSEMBLY_SERVER は呼び出し元により DBTYPE_WSTR 型として指定することができますが、行セットには格納されません。指定しない場合、行セットでは既定で現在のサーバーが使用されます。次の表に、SQL_ASSEMBLY_DEPENDENCIES スキーマ行セットの定義を示します。
列名 | データ型 | 説明 |
---|---|---|
ASSEMBLY_CATALOG |
DBTYPE_WSTR |
このデータ型を含むアセンブリのカタログ名。 |
ASSEMBLY_SCHEMA |
DBTYPE_WSTR |
このデータ型を含むアセンブリのスキーマ名 (所有者の名前)。アセンブリのスコープはスキーマではなくデータベースによって決まりますが、アセンブリには依然として所有者が存在します。 |
ASSEMBLY_ID |
DBTYPE_UI4 |
アセンブリのオブジェクト ID。 |
REFERENCED_ASSEMBLY_ID |
DBTYPE_UI4 |
参照されるアセンブリのオブジェクト ID。 |
SQL_USER_TYPES スキーマ行セット
SQL Native Client OLE DB プロバイダは、特定サーバーの登録済み UDT が追加されたタイミングに関する情報が格納される、新しいスキーマ行セット SQL_USER_TYPES を公開します。UDT_SERVER は、呼び出し元により DBTYPE_WSTR 型として指定される必要がありますが、行セットには格納されません。次の表に、SQL_USER_TYPES スキーマ行セットの定義を示します。
列名 | データ型 | 説明 |
---|---|---|
UDT_CATALOGNAME |
DBTYPE_WSTR |
UDT 列の場合、このプロパティは、UDT が定義されているカタログ名を指定する文字列です。 |
UDT_SCHEMANAME |
DBTYPE_WSTR |
UDT 列の場合、このプロパティは、UDT が定義されているスキーマ名を指定する文字列です。 |
UDT_NAME |
DBTYPE_WSTR |
UDT を含むアセンブリの名前。 |
UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
型名の前に名前空間を付けた完全な型名 (AQN) (該当する場合)。 |
COLUMNS スキーマ行セット
COLUMNS スキーマ行セットには、次の列が追加されました。
列名 | データ型 | 説明 |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
UDT 列の場合、このプロパティは、UDT が定義されているカタログ名を指定する文字列です。 |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
UDT 列の場合、このプロパティは、UDT が定義されているスキーマ名を指定する文字列です。 |
SS_UDT_NAME |
DBTYPE_WSTR |
UDT の名前。 |
SS_UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
型名の前に名前空間を付けた完全な型名 (AQN) (該当する場合)。 |
OLE DB プロパティ セットに関する追加事項と変更事項
SQL Native Client では、多くの主要な OLE DB のプロパティ セットに新しい値が追加され、変更が加えられました。
DBPROPSET_SQLSERVERPARAMETER プロパティ セット
OLE DB で UDT をサポートするため、SQL Native Client では、次の値を含む新しい DBPROPSET_SQLSERVERPARAMETER プロパティ セットが実装されました。
名前 | データ型 | 説明 |
---|---|---|
SSPROP_PARAM_UDT_CATALOGNAME |
DBTYPE_WSTR |
3 部構成の名前の識別子。 |
SSPROP_PARAM_UDT_SCHEMANAME |
DBTYPE_WSTR |
3 部構成の名前の識別子。 |
SSPROP_PARAM_UDT_NAME |
DBTYPE_WSTR |
3 部構成の名前の識別子。 |
SSPROP_PARAM_UDT_NAME は必須です。SSPROP_PARAM_UDT_CATALOGNAME と SSPROP_PARAM_UDT_SCHEMANAME は省略可能です。いずれかのプロパティが適切に指定されていない場合、DB_E_ERRORSINCOMMAND が返されます。SSPROP_PARAM_UDT_CATALOGNAME プロパティと SSPROP_PARAM_UDT_SCHEMANAME プロパティがどちらも指定されていない場合、UDT は、テーブルと同じデータベースおよびスキーマ内に定義する必要があります。UDT の定義が、テーブルと同じデータベース内にあって、同じスキーマ内にない場合、SSPROP_PARAM_UDT_SCHEMANAME プロパティを指定する必要があります。UDT の定義がテーブルと異なるデータベースにある場合、SSPROP_PARAM_UDT_CATALOGNAME プロパティと SSPROP_PARAM_UDT_SCHEMANAME プロパティの両方を指定する必要があります。
DBPROPSET_SQLSERVERCOLUMN プロパティ セット
ITableDefinition インターフェイスでのテーブルの作成をサポートするため、SQL Native Client では、DBPROPSET_SQLSERVERCOLUMN プロパティ セットに次の 3 つの新しい列が追加されました。
名前 | データ型 | 説明 |
---|---|---|
SSPROP_COL_UDT_CATALOGNAME |
VT_BSTR |
DBTYPE_UDT 型の列の場合、このプロパティは、UDT が定義されているカタログ名を指定する文字列です。 |
SSPROP_COL_UDT_SCHEMANAME |
VT_BSTR |
DBTYPE_UDT 型の列の場合、このプロパティは、UDT が定義されているスキーマ名を指定する文字列です。 |
SSPROP_COL_UDT_NAME |
VT_BSTR |
DBTYPE_UDT 型の列の場合、このプロパティは、UDT の 1 部構成の名前を指定する文字列です。他のデータ型の列の場合、このプロパティでは空文字列が返されます。 |
メモ : |
---|
UDT は PROVIDER_TYPES スキーマ行セットには表示されません。 |
OLE DB インターフェイスに関する追加事項と変更事項
SQL Native Client では、多くの主要な OLE DB インターフェイスに新しい値が追加され、変更が加えられました。
ISSCommandWithParameters インターフェイス
OLE DB で UDT をサポートするため、SQL Native Client では、ISSCommandWithParameters インターフェイスの追加など、多数の変更が加えられました。この新しいインターフェイスは、主要な OLE DB インターフェイス ICommandWithParameters から継承されます。ICommandWithParameters インターフェイスから継承される 3 つのメソッド (GetParameterInfo、MapParameterNames、および SetParameterInfo) に加えて、ISSCommandWithParameters インターフェイスでは、サーバー固有のデータ型を処理する GetParameterProperties メソッドと SetParameterProperties メソッドが提供されます。
メモ : |
---|
また、ISSCommandWithParameters インターフェイスでは、新しい SSPARAMPROPS 構造体も使用されます。 |
IColumnsRowset インターフェイス
ISSCommandWithParameters インターフェイス以外にも、SQL Native Client により、IColumnsRowset::GetColumnRowset メソッドの呼び出しで返される行セットに、次の新しい値が追加されます。
列名 | データ型 | 説明 |
---|---|---|
DBCOLUMN_SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
UDT カタログ名の識別子。 |
DBCOLUMN_SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
UDT スキーマ名の識別子。 |
DBCOLUMN_SS_UDT_NAME |
DBTYPE_WSTR |
UDT 名の識別子。 |
DBCOLUMN_SS_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
型名と、CLR での参照に必要なすべてのアセンブリ ID を含むアセンブリ修飾名。 |
DBCOLUMN_TYPE を DBTYPE_UDT に設定すると、上記の新しく追加された UDT メタデータを参照することにより、サーバーの UDT 列と他のバイナリ型列とを区別することができます。そのデータが部分的に完成している場合、サーバーのデータ型は UDT になります。サーバーのデータ型が UDT 以外の場合、これらの列は、常に NULL として返されます。
SQL Native Client ODBC ドライバ
UDT をサポートするため、SQL Native Client ODBC ドライバでは、多数の変更が加えられました。SQL Native Client ODBC ドライバでは、SQL Server の UDT を、SQL_SS_UDT ドライバ固有の SQL データ型 ID にマップします。UDT 列は SQL_SS_UDT 型としてマップされます。UDT の ToString メソッドや ToXMLString メソッド、または CAST/CONVERT 関数を使用して SQL ステートメントで UDT 列を明示的に別の型にマップした場合、結果セット列のデータ型は、実際に列が変換された後の型になります。
SQLColAttribute、SQLDescribeParam、SQLGetDescField
結果セットの UDT 列またはストアド プロシージャやパラメータ化クエリの UDT パラメータの詳細情報を提供するために、ドライバ固有の新しい 4 つの記述子フィールドが追加されました。この情報は、SQLColAttribute、SQLDescribeParam、および SQLGetDescField 関数を使用して取得できます。
新しく追加された記述子フィールドは、SQL_CA_SS_UDT_CATALOG_NAME、SQL_CA_SS_UDT_SCHEMA_NAME、SQL_CA_SS_UDT_TYPE_NAME、および SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME です。
SQLColumns、SQLProcedureColumns
また、SQLColumns 関数と SQLProcedureColumns 関数から返される結果セットには、UDT 結果セット列または UDT パラメータのいずれかに関する詳細情報を提供するために、ドライバ固有の 3 つの新しい列が追加されました。新しく追加された 3 つの列は、SS_UDT_CATALOG_NAME、SS_UDT_SCHEMA_NAME、および SS_UDT_ASSEMBLY_TYPE_NAME です。
サポートされる変換
SQL データ型から C データ型に変換する際、SQL_C_WCHAR、SQL_C_BINARY、および SQL_C_CHAR は、すべて SQL_SS_UDT に変換できます。ただし、SQL_C_WCHAR と SQL_C_CHAR SQL から変換した場合、バイナリ データは 16 進文字列に変換されることに注意してください。
C データ型から SQL データ型に変換する際、SQL_C_WCHAR、SQL_C_BINARY、および SQL_C_CHAR は、すべて SQL_SS_UDT に変換できます。ただし、SQL_C_WCHAR と SQL_C_CHAR SQL から変換した場合、バイナリデータは 16 進文字列に変換されることに注意してください。
参照
関連項目
ISSCommandWithParameters (OLE DB)