SQLGetDescField

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Natywny sterownik ODBC klienta SQL Server udostępnia tylko pola deskryptoryczne specyficzne dla sterownika (IRD). W IRD pola deskryptorów SQL Server są odwoływane za pomocą atrybutów kolumn specyficznych dla sterownika. Aby uzyskać informacje o pełnej liście dostępnych pól deskryptorów specyficznych dla sterowników, zobacz SQLColAttribute.

Pola deskryptorów zawierające ciągi identyfikatorów kolumn są często ciągami o zerowej długości. Wszystkie wartości pola deskryptoryczne specyficzne dla SQL Server są dostępne tylko do odczytu.

Podobnie jak atrybuty pobierane za pomocą SQLColAttribute, pola deskryptorów raportujące atrybuty na poziomie wiersza (takie jak SQL_CA_SS_COMPUTE_ID) są raportowane dla wszystkich kolumn w zbiorze wyników.

SQLGetDescField i parametry Table-Valued

SQLGetDescField może być używany do uzyskania wartości rozszerzonych atrybutów parametrów tabelowych oraz kolumn parametrów tabelowych. Więcej informacji o parametrach tabelowych można znaleźć w Table-Valued Parameters (ODBC).

Wsparcie SQLGetDescField dla ulepszonych funkcji dat i czasu

Aby uzyskać informacje o polach deskryptorowych dostępnych przy nowych typach dat/godziny, zobacz metadane parametrów i wyników.

Aby uzyskać więcej informacji, zobacz ulepszenia daty i godziny (ODBC).

Począwszy od SQL Server 2012 roku (11.x), SQLGetDescField może zwracać SQL_C_SS_TIME2 (dla typów czasowych) lub SQL_C_SS_TIMESTAMPOFFSET (dla datetimeoffset) zamiast SQL_C_BINARY, jeśli Twoja aplikacja korzysta z ODBC 3.8.

SQLGetDescField obsługa dużych CLR UDT

SQLGetDescField obsługuje duże typy CLR zdefiniowane przez użytkownika (UDT). Aby uzyskać więcej informacji, zobacz large CLR User-Defined Types (ODBC).

SQLGetDescField Support for Sparse Columns

SQLGetDescField może być użyty do zapytania do nowego pola IRD SQL_CA_SS_IS_COLUMN_SET w celu ustalenia, czy kolumna jest kolumną column_set .

Więcej informacji można znaleźć w artykule Sparse Columns Support (ODBC).

Example

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