ユーザー定義型の使用

SQL Server 2005 では、ユーザー定義型 (UDT) が導入されました。これにより、SQL Server データベースにオブジェクトやカスタム データ構造を格納できるようになり、SQL の型システムが拡張されます。UDT は複数のデータ型を保持でき、動作を含むことができるので、1 つの SQL Server システム データ型だけで構成される従来の別名データ型とは異なります。UDT は、検証可能なコードを生成する .NET 共通言語ランタイム (CLR) でサポートされる任意の言語を使用して定義されます。このような言語には、Microsoft Visual C#® や Visual Basic® .NET があります。データは、.NET のクラスまたは構造体のフィールドやプロパティとして公開され、動作はクラスまたは構造体のメソッドによって定義されます。

UDT は、テーブルの列定義、Transact-SQL バッチの変数、または Transact-SQL 関数やストアド プロシージャの引数として使用することができます。UDT の詳細については、「CLR ユーザー定義型の使用」を参照してください。

SQL Server Native Client OLE DB プロバイダ

SQL Server Native Client OLE DB プロバイダでは、UDT はメタデータ情報を持つバイナリ型としてサポートされるので、オブジェクトとして管理できます。UDT 列は、DBTYPE_UDT 型として公開され、この列のメタデータは主要な OLE DB インターフェイスの IColumnRowset と新しいインターフェイスの ISSCommandWithParameters により公開されます。

注意

IRowsetFind::FindNextRow メソッドでは、UDT データ型を処理できません。UDT が検索列の型として使用されると、DB_E_BADCOMPAREOP が返されます。

データ バインドと強制型変換

次の表に、特定のデータ型を SQL Server の UDT と共に使用した場合に行われるバインドおよび強制型変換を示します。UDT 列は、SQL Server Native Client OLE DB プロバイダにより DBTYPE_UDT 型として公開されます。この列のメタデータは、適切なスキーマ行セットを使用して取得できるので、独自に定義した型をオブジェクトとして管理できます。

データ型

SQL Server の

UDT

SQL Server の

UDT 以外

SQL Server の

UDT から

SQL Server の

UDT 以外から

DBTYPE_UDT

サポートされています6

エラー1

サポートされています6

エラー5

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 Server 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 Server 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 Server 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 Server 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 Server Native Client では、多くの主要な OLE DB のプロパティ セットに新しい値が追加され、変更が加えられました。

DBPROPSET_SQLSERVERPARAMETER プロパティ セット

OLE DB で UDT をサポートするため、SQL Server Native Client では、次の値を含む新しい DBPROPSET_SQLSERVERPARAMETER プロパティ セットが実装されました。

名前

データ型

説明

SSPROP_PARAM_UDT_CATALOGNAME

DBTYPE_WSTR

3 部構成の名前の識別子。

UDT パラメータの場合、このプロパティは、ユーザー定義型が定義されているカタログ名を指定する文字列です。

SSPROP_PARAM_UDT_SCHEMANAME

DBTYPE_WSTR

3 部構成の名前の識別子。

UDT パラメータの場合、このプロパティは、ユーザー定義型が定義されているスキーマ名を指定する文字列です。

SSPROP_PARAM_UDT_NAME

DBTYPE_WSTR

3 部構成の名前の識別子。

UDT 列の場合、このプロパティは、ユーザー定義型の 1 部構成の名前を指定する文字列です。

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 Server Native Client では、DBPROPSET_SQLSERVERCOLUMN プロパティ セットに次の 3 つの新しい列が追加されました。

名前

説明

データ型

説明

SSPROP_COL_UDT_CATALOGNAME

UDT_CATALOGNAME

VT_BSTR

DBTYPE_UDT 型の列の場合、このプロパティは、UDT が定義されているカタログ名を指定する文字列です。

SSPROP_COL_UDT_SCHEMANAME

UDT_SCHEMANAME

VT_BSTR

DBTYPE_UDT 型の列の場合、このプロパティは、UDT が定義されているスキーマ名を指定する文字列です。

SSPROP_COL_UDT_NAME

UDT_NAME

VT_BSTR

DBTYPE_UDT 型の列の場合、このプロパティは、UDT の 1 部構成の名前を指定する文字列です。他のデータ型の列の場合、このプロパティでは空文字列が返されます。

注意

UDT は PROVIDER_TYPES スキーマ行セットには表示されません。すべての列は読み取り/書き込みアクセスです。

ADO では、"説明" 列の対応するエントリを使用してこれらのプロパティを参照します。

SSPROP_COL_UDTNAME は必須です。SSPROP_COL_UDT_CATALOGNAME と SSPROP_COL_UDT_SCHEMANAME は省略可能です。いずれかのプロパティが適切に指定されていない場合、DB_E_ERRORSINCOMMAND が返されます。

SSPROP_COL_UDT_CATALOGNAME プロパティと SSPROP_COL_UDT_SCHEMANAME プロパティがどちらも指定されていない場合、UDT は、テーブルと同じデータベースおよびスキーマ内に定義する必要があります。

UDT の定義が、テーブルと同じデータベース内にあって、同じスキーマ内にない場合、SSPROP_COL_UDT_SCHEMANAME プロパティを指定する必要があります。

UDT の定義がテーブルと異なるデータベースにある場合、SSPROP_COL_UDT_CATALOGNAME プロパティと SSPROP_COL_UDT_SCHEMANAME プロパティの両方を指定する必要があります。

OLE DB インターフェイスに関する追加事項と変更事項

SQL Server Native Client では、多くの主要な OLE DB インターフェイスに新しい値が追加され、変更が加えられました。

ISSCommandWithParameters インターフェイス

OLE DB で UDT をサポートするため、SQL Server Native Client では、ISSCommandWithParameters インターフェイスの追加など、多数の変更が加えられました。この新しいインターフェイスは、主要な OLE DB インターフェイス ICommandWithParameters から継承されます。ICommandWithParameters インターフェイスから継承される 3 つのメソッド (GetParameterInfoMapParameterNames、および SetParameterInfo) に加えて、ISSCommandWithParameters インターフェイスでは、サーバー固有のデータ型を処理する GetParameterProperties メソッドと SetParameterProperties メソッドが提供されます。

注意

また、ISSCommandWithParameters インターフェイスでは、新しい SSPARAMPROPS 構造体も使用されます。

IColumnsRowset インターフェイス

ISSCommandWithParameters インターフェイス以外にも、SQL Server 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 Server Native Client ODBC ドライバ

UDT をサポートするため、SQL Server Native Client ODBC ドライバでは、多数の変更が加えられました。SQL Server 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 つの記述子フィールドが追加されました。この情報は、SQLColAttributeSQLDescribeParam、および 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 進文字列に変換されることに注意してください。