SQLGetDescField

Aplica-se a: SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)

O driver ODBC do SQL Server Native Client expõe campos de descritores específicos do driver apenas para o descritor de linha de implementação (IRD). Dentro do IRD, os campos do descritor do SQL Server são referenciados através de atributos de coluna específicos do driver. Para informações sobre uma lista completa de campos de descrição específicos de driver disponíveis, consulte SQLColAttribute.

Os campos de descritores que contêm cadeias de identificadores de colunas são frequentemente cadeias de comprimento zero. Todos os valores de campo descritor específicos do SQL Server são apenas leitura.

Tal como os atributos recuperados com SQLColAttribute, os campos descritor que reportam atributos ao nível da linha (como SQL_CA_SS_COMPUTE_ID) são reportados para todas as colunas do conjunto de resultados.

SQLGetDescField e Parâmetros Table-Valued

O SQLGetDescField pode ser usado para obter valores para atributos estendidos de parâmetros de tabela e colunas de parâmetros com valores de tabela. Para mais informações sobre parâmetros com valores de tabela, veja Table-Valued Parâmetros (ODBC).

Suporte SQLGetDescField para funcionalidades melhoradas de data e hora

Para informações sobre os campos de descritores disponíveis com os novos tipos de data/hora, consulte Metadados de Parâmetro e Resultado.

Para obter mais informações, consulte Melhorias de data e hora (ODBC).

A partir de SQL Server 2012 (11.x), o SQLGetDescField pode devolver SQL_C_SS_TIME2 (para tipos de tempo) ou SQL_C_SS_TIMESTAMPOFFSET (para datetimeoffset) em vez de SQL_C_BINARY, se a sua aplicação usar ODBC 3.8.

Suporte SQLGetDescField para grandes CLR UDTs

O SQLGetDescField suporta grandes tipos CLR definidos pelo utilizador (UDTs). Para obter mais informações, consulte Large CLR User-Defined Types (ODBC).

Suporte a SQLGetDescField para colunas esparsas

O SQLGetDescField pode ser usado para consultar o novo campo IRD SQL_CA_SS_IS_COLUMN_SET determinar se uma coluna é uma coluna column_set .

Para mais informações, consulte Suporte a Colunas Escassas (ODBC).

Exemplo

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);  
    }