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

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (SNAC と略されることがよくあります) は、SQL Server 2022 (16.x) と SQL Server Management Studio 19 (SSMS) から削除されました。 SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。 今後、新しい Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server または最新の Microsoft ODBC Driver for SQL Server に切り替えてください。 SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、このサポート ライフサイクルの例外を参照してください。

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

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

SQL Server Native Clientでの大きな CLR UDT のサポートの詳細については、「大きな 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 2n 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 ユーザー定義型