SQLGetDescField
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
SQL Server Native Client ODBC ドライバーは、実装行記述子 (IRD) 専用のドライバー固有の記述子フィールドを公開します。 IRD 内では、SQL Server 記述子フィールドはドライバー固有の列属性を介して参照されます。 使用可能なドライバー固有の記述子フィールドの完全な一覧については、「 SQLColAttributeを参照してください。
列 ID 文字列を含む記述子フィールドは、多くの場合、長さが 0 の文字列になります。 すべての SQL Server 固有の記述子フィールド値は読み取り専用です。
SQLColAttribute で取得された属性と同様に、行レベルの属性 (SQL_CA_SS_COMPUTE_ID など) を報告する記述子フィールドは、結果セット内のすべての列について報告されます。
SQLGetDescField とテーブル値パラメーター
SQLGetDescField を使用すると、テーブル値パラメーターとテーブル値パラメーター列の拡張属性の値を取得できます。 テーブル値パラメーターの詳細については、「 Table-Valued Parameters (ODBC)」を参照してください。
SQLGetDescField による機能強化された日付と時刻のサポート
新しい日付/時刻型で使用できる記述子フィールドの詳細については、「 パラメーターと結果メタデータを参照してください。
詳細については、「 Date and Time Improvements (ODBC)」を参照してください。
SQL Server 2012 (11.x) 以降、アプリケーションで ODBC 3.8 を使用している場合、SQLGetDescField はSQL_C_BINARYではなくSQL_C_SS_TIME2 (time 型の場合) またはSQL_C_SS_TIMESTAMPOFFSET (datetimeoffset) を返すことができます。
SQLGetDescField による大きな CLR UDT のサポート
SQLGetDescField では、大きな CLR ユーザー定義型 (UDT) がサポートされます。 詳細については、「 Large CLR ユーザー定義型 (ODBC)を参照してください。
SQLGetDescField によるスパース列のサポート
SQLGetDescField を使用すると、新しい IRD フィールド SQL_CA_SS_IS_COLUMN_SETのクエリを実行して、列が column_set 列であるかどうかを判断できます。
詳細については、「 Sparse Columns Support (ODBC)」を参照してください。
例
typedef struct tagCOMPUTEBYLIST
{
SQLSMALLINT nBys;
SQLSMALLINT aByList[1];
} COMPUTEBYLIST;
typedef COMPUTEBYLIST* PCOMPUTEBYLIST;
SQLHDESC hIRD;
SQLINTEGER cbIRD;
SQLINTEGER nSet = 0;
// . . .
// Execute a statement that contains a COMPUTE clause,
// then get the descriptor handle of the IRD and
// get some IRD values.
SQLGetStmtAttr(g_hStmt, SQL_ATTR_IMP_ROW_DESC,
(SQLPOINTER) &hIRD, sizeof(SQLHDESC), &cbIRD);
// For statement-wide column attributes, any
// descriptor record will do. You know that 1 exists,
// so use it.
SQLGetDescField(hIRD, 1, SQL_CA_SS_NUM_COMPUTES,
(SQLPOINTER) &nComputes, SQL_IS_INTEGER, &cbIRD);
if (nSet == 0)
{
SQLINTEGER nOrderID;
printf_s("Normal result set.\n");
for (nCol = 0; nCol < nCols; nCol++)
{
SQLGetDescField(hIRD, nCol+1,
SQL_CA_SS_COLUMN_ORDER,
(SQLPOINTER) &nOrderID, SQL_IS_INTEGER,
&cbIRD);
if (nOrderID != 0)
{
printf_s("Col in ORDER BY, pos: %ld",
nOrderID);
}
printf_s("\n");
}
printf_s("\n");
}
else
{
PCOMPUTEBYLIST pByList;
SQLSMALLINT nBy;
SQLINTEGER nColID;
printf_s("Computed result set number: %lu\n",
nSet);
SQLGetDescField(hIRD, 1, SQL_CA_SS_COMPUTE_BYLIST,
(SQLPOINTER) &pByList, SQL_IS_INTEGER,
&cbIRD);
if (pByList != NULL)
{
printf_s("Clause ordered by columns: ");
for (nBy = 0; nBy < pByList->nBys; )
{
printf_s("%u", pByList->aByList[nBy]);
nBy++;
if (nBy == pByList->nBys)
{
printf_s("\n");
}
else
{
printf_s(", ");
}
}
}
else
{
printf_s("Compute clause set not ordered.\n");
}
for (nCol = 0; nCol < nCols; nCol++)
{
SQLGetDescField(hIRD, nCol+1,
SQL_CA_SS_COLUMN_ID, (SQLPOINTER) &nColID,
SQL_IS_INTEGER, &cbIRD);
printf_s("ColumnID: %lu, nColID);
}
printf_s("\n");
}
if (SQLMoreResults(g_hStmt) == SQL_SUCCESS)
{
// Determine the result set indicator.
SQLGetDescField(hIRD, 1, SQL_CA_SS_COMPUTE_ID,
(SQLPOINTER) &nSet, SQL_IS_INTEGER, &cbIRD);
}