Поделиться через


SQLGetDescField

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Драйвер ODBC для собственного клиента SQL Server предоставляет только поля дескриптора строки реализации (IRD). В среде IRD поля дескриптора SQL Server ссылаются с помощью атрибутов столбца для конкретного драйвера. Полный список доступных полей дескриптора для конкретного драйвера см. в статье SQLColAttribute.

Поля дескриптора, содержащие строки идентификатора столбца, часто являются строками нулевой длины. Все значения полей дескриптора sql Server доступны только для чтения.

Как и атрибуты, полученные с помощью SQLColAttribute, поля дескриптора, сообщающие атрибуты уровня строк (например, SQL_CA_SS_COMPUTE_ID), сообщаются для всех столбцов в результирующем наборе.

Функция SQLGetDescField и возвращающие табличные значения параметры

SQLGetDescField можно использовать для получения значений для расширенных атрибутов табличных параметров и столбцов возвращаемых табличным значением параметров. Дополнительные сведения о табличном значении параметров см. в разделе "Параметры с табличным значением" (ODBC).

Поддержка функции SQLGetDescField для усовершенствованных функций даты-времени

Сведения о полях дескриптора, доступных с новыми типами даты и времени, см. в разделе "Параметры" и "Метаданные результата".

Дополнительные сведения см. в разделе "Улучшения даты и времени" (ODBC).

Начиная с SQL Server 2012 (11.x), SQLGetDescField может возвращать SQL_C_SS_TIME2 (для типов времени ) или SQL_C_SS_TIMESTAMPOFFSET (для datetimeoffset) вместо SQL_C_BINARY, если приложение использует ODBC 3.8.

Поддержка функции SQLGetDescField для больших определяемых пользователем типов данных CLR

SQLGetDescField поддерживает большие определяемые пользователем типы CLR (определяемые пользователем UDT). Дополнительные сведения см. в разделе "Крупные определяемые пользователем типы CLR" (ODBC).

Поддержка функции SQLGetDescField Support для разреженных столбцов

SQLGetDescField можно использовать для запроса нового поля IRD SQL_CA_SS_IS_COLUMN_SET, чтобы определить, является ли столбец столбцом column_set .

Дополнительные сведения см. в разделе "Поддержка разреженных столбцов( 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);  
    }  

См. также

Функция SQLGetDescField
Подробные сведения о реализации API-интерфейсов ODBC