大きな CLR ユーザー定義型 (ODBC)

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance はいAzure Synapse Analytics はいParallel Data Warehouse

このトピックでは、大きな共通言語ランタイム (CLR) ユーザー定義型 (UDT) をサポートするための、SQL Server Native Client の ODBC に対する変更について説明します。

大きな CLR UDT の ODBC サポートを示すサンプルについては、「大きな UDT のサポート 」を参照してください

の大きな CLR UDT のサポートの詳細については、「SQL Server Native Client CLR の大きな型」をUser-Definedしてください

データ形式

SQL Server Native Client では、大きなオブジェクト (LOB) の型について、列のサイズが 8,000 バイトを超えていることを示す場合に、SQL_SS_LENGTH_UNLIMITED が使用されます。 SQL Server 2008 以降では、サイズが 8,000 バイトを超えている CLR UDT にも同じ値が使用されるようになりました。

UDT 値はバイト配列として表されます。 16 進文字列との間の変換がサポートされています。 リテラル値は、"0x" で始まる 16 進文字列として表されます。

次の表に、パラメーターおよび結果セットでのデータ型のマッピングを示します。

SQL Server のデータ型 SQL データ型
CLR UDT SQL_SS_UDT -151 (sqlncli.h)

次の表では、対応する 構造体と ODBC C 型について説明します。 基本的に、CLR UDT は追加の メタデータを持つ varbinary 型です。

SQL データ型 メモリ レイアウト C データ型 値 (sqlext.h)
SQL_SS_UDT SQLCHAR *(unsigned char * ) SQL_C_BINARY SQL_BINARY (-2)

パラメーターの記述子フィールド

IPD フィールドに返される情報は次のとおりです。

記述子フィールド SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT

(8,000 バイトを超える長さ)
SQL_DESC_CASE_SENSITIVE SQL_FALSE SQL_FALSE
SQL_DESC_CONCISE_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DESC_DATETIME_INTERVAL_CODE 0 0
SQL_DESC_DATETIME_INTERVAL_PRECISION n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_FIXED_PREC_SCALE SQL_FALSE SQL_FALSE
SQL_DESC_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_LOCAL_TYPE_NAME "udt" "udt"
SQL_DESC_OCTET_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_PRECISION n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_SCALE 0 0
SQL_DESC_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DESC_TYPE_NAME "udt" "udt"
SQL_DESC_UNSIGNED SQL_TRUE SQL_TRUE
SQL_CA_SS_UDT_CATALOG_NAME UDT を含むカタログの名前 UDT を含むカタログの名前
SQL_CA_SS_UDT_SCHEMA_NAME UDT を含むスキーマの名前 に UDT が含まれているスキーマの名前。
SQL_CA_SS_UDT_TYPE_NAME UDT の名前 UDT の名前
SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME UDT の完全修飾名 UDT の完全修飾名

UDT パラメーターの場合、SQL_CA_SS_UDT_TYPE_NAME SQLSetDescField を使用して設定する必要があります。 SQL_CA_SS_UDT_CATALOG_NAME と SQL_CA_SS_UDT_SCHEMA_NAME は省略可能です。

UDT が、テーブルとは異なるスキーマで同じデータベースに定義されている場合は、SQL_CA_SS_UDT_SCHEMA_NAME を設定する必要があります。

UDT がテーブルとは別のデータベースに定義されている場合は、SQL_CA_SS_UDT_CATALOG_NAME と SQL_CA_SS_UDT_SCHEMA_NAME を設定する必要があります。

SQL_CA_SS_UDT_TYPE_NAME、SQL_CA_SS_UDT_CATALOG_NAME、または SQL_CA_SS_UDT_SCHEMA_NAME の設定にエラーや省略があった場合は、SQLSTATE HY000 およびサーバー固有のメッセージ テキストで、診断レコードが生成されます。

結果の記述子フィールド

IRD フィールドに返される情報は次のとおりです。

記述子フィールド SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT

(8,000 バイトを超える長さ)
SQL_DESC_AUTO_UNIQUE_VALUE SQL_FALSE SQL_FALSE
SQL_DESC_CASE_SENSITIVE SQL_FALSE SQL_FALSE
SQL_DESC_CONCISE_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DESC_DATETIME_INTERVAL_CODE 0 0
SQL_DESC_DATETIME_INTERVAL_PRECISION n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_DISPLAY_SIZE 2 n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_FIXED_PREC_SCALE SQL_FALSE SQL_FALSE
SQL_DESC_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_LITERAL_PREFIX "0x" "0x"
SQL_DESC_LITERAL_SUFFIX "" ""
SQL_DESC_LOCAL_TYPE_NAME "udt" "udt"
SQL_DESC_OCTET_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_PRECISION n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_SCALE 0 0
SQL_DESC_SEARCHABLE SQL_PRED_NONE SQL_PRED_NONE
SQL_DESC_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DESC_TYPE_NAME "udt" "udt"
SQL_DESC_UNSIGNED SQL_TRUE SQL_TRUE
SQL_CA_SS_UDT_CATALOG_NAME UDT を含むカタログの名前 UDT を含むカタログの名前
SQL_CA_SS_UDT_SCHEMA_NAME UDT を含むスキーマの名前 UDT を含むスキーマの名前
SQL_CA_SS_UDT_TYPE_NAME UDT の名前 UDT の名前
SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME UDT の完全修飾名 UDT の完全修飾名

SQLColumns および SQLProcedureColumns から返される列のメタデータ (カタログ メタデータ)

UDT に対して次の列値が返されます。

列名 SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT

(8,000 バイトを超える長さ)
DATA_TYPE SQL_SS_UDT SQL_SS_UDT
TYPE_NAME UDT の名前 UDT の名前
COLUMN_SIZE n SQL_SS_LENGTH_UNLIMITED (0)
BUFFER_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
DECIMAL_DIGITS NULL NULL
SQL_DATA_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DATETIME_SUB NULL NULL
CHAR_OCTET_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SS_UDT_CATALOG_NAME UDT を含むカタログの名前 UDT を含むカタログの名前
SS_UDT_SCHEMA_NAME UDT を含むスキーマの名前 UDT を含むスキーマの名前
SS_UDT_ASSEMBLY_TYPE_NAME UDT の完全修飾名 UDT の完全修飾名

最後の 3 つの列はドライバー固有の列です。 これらは、ODBC で定義された列の後、SQLColumns または SQLProcedureColumns の結果セットの既存のドライバー固有の列の前に追加されます。

SQLGetTypeInfo、個々の UDT、またはジェネリック型 "udt" の行は返されません。

バインドと変換

SQL から C データ型への変換としてサポートされているものは次のとおりです。

変換対象 SQL_SS_UDT
SQL_C_WCHAR サポートされている *
SQL_C_BINARY サポートされています
SQL_C_CHAR サポートされている *

* バイナリ データは 16 進文字列に変換されます。

C から SQL データ型への変換としてサポートされているものは次のとおりです。

変換対象 SQL_SS_UDT
SQL_C_WCHAR サポートされている *
SQL_C_BINARY サポートされています
SQL_C_CHAR サポートされている *

* 16 進文字列からバイナリ データへの変換が行われます。

SQL_VARIANT による UDT のサポート

SQL_VARIANT 列では UDT がサポートされません。

BCP による UDT のサポート

UDT 値は、文字またはバイナリ値としてのみインポートおよびエクスポートできます。

UDT に対する下位クライアントの動作

UDT に対しては、下位クライアントで次のように型マッピングが行われます。

サーバーのバージョン SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT

(8,000 バイトを超える長さ)
SQL Server 2005 UDT varbinary(max)
SQL Server 2008 以降 UDT UDT

大きな CLR UDT をサポートする ODBC 関数

ここでは、大きな CLR UDT をサポートするための、SQL Server Native Client の ODBC 関数に対する変更について説明します。

SQLBindCol

UDT の結果列の値は、このトピックの「バインドと変換」セクションで説明したように、SQL データ型から C データ型に変換されます。

SQLBindParameter

UDT に必要な値は次のとおりです。

SQL データ型 Parametertype ColumnSizePtr DecimalDigitsPtr
SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT n 0
SQL_SS_UDT

(8,000 バイトを超える長さ)
SQL_SS_UDT SQL_SS_LENGTH_UNLIMITED (0) 0

SQLColAttribute

UDT に対して返される値は、このトピックの「結果の記述子フィールド」で説明したとおりです。

SQLColumns

UDT に対して返される値は、このトピックの「SQLColumns と SQLProcedureColumns (カタログ メタデータ)によって返される列メタデータ」セクションで説明したとおりです。

SQLDescribeCol

UDT に対して返される値は次のとおりです。

SQL データ型 DataTypePtr ColumnSizePtr DecimalDigitsPtr
SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT n 0
SQL_SS_UDT

(8,000 バイトを超える長さ)
SQL_SS_UDT SQL_SS_LENGTH_UNLIMITED (0) 0

SQLDescribeParam

UDT に対して返される値は次のとおりです。

SQL データ型 DataTypePtr ColumnSizePtr DecimalDigitsPtr
SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT n 0
SQL_SS_UDT

(8,000 バイトを超える長さ)
SQL_SS_UDT SQL_SS_LENGTH_UNLIMITED (0) 0

SQLFetch

UDT の結果列の値は、このトピックの「バインドと変換」セクションで説明したように、SQL データ型から C データ型に変換されます。

SQLFetchScroll

UDT の結果列の値は、このトピックの「バインドと変換」セクションで説明したように、SQL データ型から C データ型に変換されます。

SQLGetData

UDT の結果列の値は、このトピックの「バインドと変換」セクションで説明したように、SQL データ型から C データ型に変換されます。

SQLGetDescField

新しい型で使用できる記述子フィールドは、このトピックの「パラメーターの記述子フィールド」および「結果の記述子フィールド」で説明したとおりです。

SQLGetDescRec

UDT に対して返される値は次のとおりです。

SQL データ型 種類 サブタイプ 長さ 有効桁数 スケール
SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT 0 n n 0
SQL_SS_UDT

(8,000 バイトを超える長さ)
SQL_SS_UDT 0 SQL_SS_LENGTH_UNLIMITED (0) SQL_SS_LENGTH_UNLIMITED (0) 0

SQLGetTypeInfo

UDT に対して返される値は、このトピックの「SQLColumns および SQLProcedureColumns から返される列のメタデータ (カタログ メタデータ)」で説明したとおりです。

SQLProcedureColumns

UDT に対して返される値は、このトピックの「SQLColumns および SQLProcedureColumns から返される列のメタデータ (カタログ メタデータ)」で説明したとおりです。

SQLPutData

UDT パラメーター値は、このトピックの「バインドと変換」セクションで説明したように、C から SQL データ型に変換されます。

SQLSetDescField

新しい型で使用できる記述子フィールドについては、このトピックの「パラメーターの記述子フィールド」および「結果の記述子フィールド」セクションを参照してください。

SQLSetDescRec

UDT に対して許可される値は次のとおりです。

SQL データ型 種類 サブタイプ 長さ 有効桁数 スケール
SQL_SS_UDT

(8,000 バイト以下の長さ)
SQL_SS_UDT 0 n n 0
SQL_SS_UDT

(8,000 バイトを超える長さ)
SQL_SS_UDT 0 SQL_SS_LENGTH_UNLIMITED (0) SQL_SS_LENGTH_UNLIMITED (0) 0

SQLSpecialColumns

DATA_TYPE、TYPE_NAME、COLUMN_SIZE、BUFFER_LENGTH、DECIMAL_DIGTS の各 UDT 列に対して返される値は、このトピックの「SQLColumns および SQLProcedureColumns から返される列のメタデータ (カタログ メタデータ)」で説明したとおりです。

参照

大きな CLR ユーザー定義型