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


Создание клиентских таблиц SQL Server Native

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

Поставщик OLE DB собственного клиента SQL Server предоставляет функцию ITableDefinition::CreateTable , позволяя потребителям создавать таблицы SQL Server. Потребители используют CreateTable для создания именованных потребителем постоянных таблиц и постоянных или временных таблиц с уникальными именами, созданными поставщиком OLE DB собственного клиента SQL Server.

Когда потребитель вызывает ITableDefinition::CreateTable, если значение свойства DBPROP_TBL_TEMPTABLE VARIANT_TRUE, поставщик OLE DB sql Server Native Client создает временное имя таблицы для потребителя. Потребитель задает для параметра pTableID метода CreateTable значение NULL. Временные таблицы с именами, созданными поставщиком OLE DB собственного клиента SQL Server, не отображаются в наборе строк TABLE , но доступны через интерфейс IOpenRowset .

Когда потребители указывают имя таблицы в члене объединения uName в параметре pTableID, поставщик OLE DB sql Server Native Client создает таблицу SQL Server с таким именем. Ограничения именования таблиц SQL Server применяются, а имя таблицы может указывать постоянную таблицу или локальную или глобальную временную таблицу. Дополнительные сведения см. в разделе CREATE TABLE. Параметр ppTableID может иметь значение NULL.

Поставщик OLE DB собственного клиента SQL Server может создавать имена постоянных или временных таблиц. Когда потребитель задает параметр pTableID значение NULL и задает ppTableID для указания допустимого DBID*, поставщик OLE DB sql Server Native Client ВОЗВРАЩАЕТ созданное имя таблицы в члене uName объединения UName db, на которое указывает значение ppTableID. Чтобы создать временную таблицу OLE DB собственного клиента SQL Server, потребитель включает свойство таблицы OLE DB DBPROP_TBL_TEMPTABLE в набор свойств таблицы, на который ссылается параметр rgPropertySets . Временные таблицы с именем поставщика OLE DB для собственного клиента SQL Server являются локальными.

Функция CreateTable возвращает значение DB_E_BADTABLEID, если член eKind параметра pTableID не указывает на DBKIND_NAME.

Использование структуры DBCOLUMNDESC

Потребитель может задать тип данных столбца либо с помощью переменной-члена pwszTypeName, либо с помощью переменной-члена wType. Если потребитель указывает тип данных в pwszTypeName, поставщик OLE DB sql Server Native Client игнорирует значение wType.

При использовании члена pwszTypeName потребитель задает тип данных с помощью имен типов данных SQL Server. Допустимыми являются имена типов данных, возвращаемые в столбце TYPE_NAME набора строк схемы PROVIDER_TYPES.

Поставщик OLE DB собственного клиента SQL Server распознает подмножество перечисленных значений DBTYPE OLE DB в члене wType . Дополнительные сведения см. в разделе Сопоставление типов данных в интерфейсе ITableDefinition.

Примечание.

Функция CreateTable возвращает значение DB_E_BADTYPE, если потребитель указал тип данных столбца с помощью члена pTypeInfo или pclsid.

Пользователь задает имя столбца в элементе pwszName объединения uName в переменной-члене dbcid структуры DBCOLUMNDESC. Имя столбца задается в виде символьной строки в Юникоде. Элемент eKind структуры dbcid должен быть равен DBKIND_NAME. CreateTable возвращает DB_E_BADCOLUMNID, если eKind недопустим, pwszName имеет значение NULL или если значение pwszName не является допустимым идентификатором SQL Server.

Все свойства столбцов доступны для всех столбцов, определенных в данной таблице. Функция CreateTable возвращает значение DB_S_ERRORSOCCURRED или DB_E_ERRORSOCCURRED, если установленные значения свойств противоречат друг другу. CreateTable возвращает ошибку, если недопустимые параметры свойства столбца вызывают сбой создания таблиц SQL Server.

Свойства столбцов в структуре DBCOLUMNDESC интерпретируются следующим образом.

Идентификатор свойства Description
DBPROP_COL_AUTOINCREMENT R/W: чтение и запись

Значение по умолчанию: VARIANT_FALSE Описание: задает свойство удостоверения в созданном столбце. Для SQL Server свойство удостоверения допустимо для одного столбца в таблице. Задание свойства VARIANT_TRUE для нескольких столбцов создает ошибку, когда поставщик OLE DB SQL Server Native Client пытается создать таблицу на сервере.

Свойство удостоверения SQL Server допустимо только для целочисленных, числовых и десятичных типов, если масштаб равен 0. Если свойство VARIANT_TRUE в столбце любого другого типа данных, возникает ошибка, когда поставщик OLE DB sql Server Native Client пытается создать таблицу на сервере.

Поставщик OLE DB собственного клиента SQL Server возвращает DB_S_ERRORSOCCURRED, если DBPROP_COL_AUTOINCREMENT и DBPROP_COL_NULLABLE VARIANT_TRUE и dwOption DBPROP_COL_NULLABLE не DBPROPOPTIONS_REQUIRED. Если оба свойства DBPROP_COL_AUTOINCREMENT и DBPROP_COL_NULLABLE имеют значение VARIANT_TRUE и элемент dwOption свойства DBPROP_COL_NULLABLE равен DBPROPOPTIONS_REQUIRED, будет возвращено значение DB_E_ERRORSOCCURRED. Столбец определен со свойством удостоверения SQL Server, а для элемента dwStatus DBPROP_COL_NULLABLE задано значение DBPROPSTATUS_CONFLICTING.
DBPROP_COL_DEFAULT R/W: чтение и запись

По умолчанию: нет

Описание. Создает ограничение ПО УМОЛЧАНИю SQL Server для столбца.

Элемент vValue структуры DBPROP может относиться к любому типу из определенного набора типов. Элемент vValue.vt должен задавать тип, совместимый с типом данных столбца. Например, если столбец имеет тип DBTYPE_WSTR и для этого столбца задано значение по умолчанию BSTR N/A, эти два типа совместимы. Определение того же значения по умолчанию для столбца, определенного как DBTYPE_R8, приводит к ошибке, когда поставщик OLE DB sql Server Native Client пытается создать таблицу на сервере.
DBPROP_COL_DESCRIPTION R/W: чтение и запись

По умолчанию: нет

Описание. Свойство столбца DBPROP_COL_DESCRIPTION не реализуется поставщиком OLE DB собственного клиента SQL Server.

Элемент dwStatus структуры DBPROP возвращает значение DBPROPSTATUS_NOTSUPPORTED при попытке потребителя записать значение свойства.

Установка свойства не является неустранимой ошибкой для поставщика OLE DB собственного клиента SQL Server. Если все остальные значения параметров допустимы, создается таблица SQL Server.
DBPROP_COL_FIXEDLENGTH R/W: чтение и запись

По умолчанию: VARIANT_FALSE

Описание. Поставщик OLE DB собственного клиента SQL Server использует DBPROP_COL_FIXEDLENGTH для определения сопоставления типов данных, когда потребитель определяет тип данных столбца с помощью элемента wType DBCOLUMNDESC. Дополнительные сведения см. в разделе Сопоставление типов данных в интерфейсе ITableDefinition.
DBPROP_COL_NULLABLE R/W: чтение и запись

По умолчанию: нет

Описание. При создании таблицы поставщик OLE DB собственного клиента SQL Server указывает, должен ли столбец принимать значения NULL, если свойство задано. Если свойство не задано, возможность столбца принимать ЗНАЧЕНИЕ NULL в качестве значения определяется параметром базы данных SQL Server ANSI_NULLS по умолчанию.

Поставщик OLE DB собственного клиента SQL Server является поставщиком, совместимым с ISO. Подключенные сеансы ведут себя в соответствии со стандартом ISO. Если потребитель не задал свойство DBPROP_COL_NULLABLE, столбец принимает значения NULL.
DBPROP_COL_PRIMARYKEY R/W: чтение и запись

Значение по умолчанию: VARIANT_FALSE описание. При VARIANT_TRUE поставщик OLE DB собственного клиента SQL Server создает столбец с ограничением PRIMARY KEY.

При задании в качестве свойства столбца только один столбец может определять это ограничение. Задание свойства VARIANT_TRUE для нескольких столбцов возвращает ошибку, когда поставщик OLE DB sql Server native client пытается создать таблицу SQL Server.

Примечание. Потребитель может использовать метод IIndexDefinition::CreateIndex для создания ограничения PRIMARY KEY для нескольких столбцов.

Поставщик OLE DB собственного клиента SQL Server возвращает DB_S_ERRORSOCCURRED, если DBPROP_COL_PRIMARYKEY и DBPROP_COL_UNIQUE оба VARIANT_TRUE, а dwOption DBPROP_COL_UNIQUE не DBPROPOPTIONS_REQUIRED.

Если оба свойства DBPROP_COL_PRIMARYKEY и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE и элемент dwOption свойства DBPROP_COL_UNIQUE равен DBPROPOPTIONS_REQUIRED, будет возвращено значение DB_E_ERRORSOCCURRED. Столбец определен со свойством удостоверения SQL Server, а для элемента dwStatus DBPROP_COL_PRIMARYKEY задано значение DBPROPSTATUS_CONFLICTING.

Поставщик OLE DB собственного клиента SQL Server возвращает ошибку, если DBPROP_COL_PRIMARYKEY и DBPROP_COL_NULLABLE оба VARIANT_TRUE.

Поставщик OLE DB собственного клиента SQL Server возвращает ошибку из SQL Server, когда потребитель пытается создать ограничение PRIMARY KEY для столбца недопустимого типа данных SQL Server. Ограничения PRIMARY KEY нельзя определить для столбцов, созданных с помощью бита типов данных SQL Server, текста, ntext и изображения.
DBPROP_COL_UNIQUE R/W: чтение и запись

По умолчанию: VARIANT_FALSE описание: применяет ограничение SQL Server UNIQUE к столбцу.

При задании в качестве свойства столбца только к одному столбцу может быть применено это ограничение. Потребитель может использовать метод IIndexDefinition::CreateIndex с целью создания ограничения UNIQUE для сочетания значений нескольких столбцов.

Поставщик OLE DB собственного клиента SQL Server возвращает DB_S_ERRORSOCCURRED, если DBPROP_COL_PRIMARYKEY и DBPROP_COL_UNIQUE VARIANT_TRUE и dwOption не DBPROPOPTIONS_REQUIRED.

Если оба свойства DBPROP_COL_PRIMARYKEY и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE и элемент dwOption равен DBPROPOPTIONS_REQUIRED, будет возвращено значение DB_E_ERRORSOCCURRED. Столбец определен со свойством удостоверения SQL Server, а для элемента dwStatus DBPROP_COL_PRIMARYKEY задано значение DBPROPSTATUS_CONFLICTING.

Поставщик OLE DB собственного клиента SQL Server возвращает DB_S_ERRORSOCCURRED, если DBPROP_COL_NULLABLE и DBPROP_COL_UNIQUE VARIANT_TRUE и dwOption не DBPROPOPTIONS_REQUIRED.

Если оба свойства DBPROP_COL_NULLABLE и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE и элемент dwOption равен DBPROPOPTIONS_REQUIRED, будет возвращено значение DB_E_ERRORSOCCURRED. Столбец определен со свойством удостоверения SQL Server, а для элемента dwStatus DBPROP_COL_NULLABLE задано значение DBPROPSTATUS_CONFLICTING.

Поставщик OLE DB собственного клиента SQL Server возвращает ошибку из SQL Server, когда потребитель пытается создать ограничение UNIQUE для столбца недопустимого типа данных SQL Server. Ограничения UNIQUE нельзя определить для столбцов, созданных с помощью типа битовых данных SQL Server.

Когда потребитель вызывает ITableDefinition::CreateTable, поставщик OLE DB sql Server Native Client интерпретирует свойства таблицы следующим образом.

Идентификатор свойства Description
DBPROP_TBL_TEMPTABLE R/W: чтение и запись

По умолчанию: VARIANT_FALSE описание. По умолчанию поставщик OLE DB собственного клиента SQL Server создает таблицы с именем потребителя. При VARIANT_TRUE поставщик OLE DB собственного клиента SQL Server создает временное имя таблицы для потребителя. Потребитель задает для параметра pTableID метода CreateTable значение NULL. Параметр ppTableID должен содержать допустимый указатель.

Если потребитель запрашивает, что набор строк будет открыт в успешно созданной таблице, поставщик OLE DB sql Server Native Client открывает поддерживаемый курсором набор строк. Все свойства набора строк могут быть заданы в передаваемых наборах свойств.

В этом примере создается таблица SQL Server.

// This CREATE TABLE statement shows the details of the table created by   
// the following example code.  
//  
// CREATE TABLE OrderDetails  
// (  
//    OrderID      int      NOT NULL  
//    ProductID   int      NOT NULL  
//    CONSTRAINT PK_OrderDetails  
//         PRIMARY KEY CLUSTERED (OrderID, ProductID),  
//    UnitPrice   money      NOT NULL,  
//    Quantity   int      NOT NULL,  
//    Discount   decimal(2,2)   NOT NULL  
//        DEFAULT 0  
// )  
//  
// The PRIMARY KEY constraint is created in an additional example.  
HRESULT CreateTable  
    (  
    ITableDefinition* pITableDefinition  
    )  
    {  
    DBID            dbidTable;  
    const ULONG     nCols = 5;  
    ULONG           nCol;  
    ULONG           nProp;  
    DBCOLUMNDESC    dbcoldesc[nCols];  
  
    HRESULT         hr;  
  
    // Set up column descriptions. First, set default property values for  
    //  the columns.  
    for (nCol = 0; nCol < nCols; nCol++)  
        {  
        dbcoldesc[nCol].pwszTypeName = NULL;  
        dbcoldesc[nCol].pTypeInfo = NULL;  
        dbcoldesc[nCol].rgPropertySets = new DBPROPSET;  
        dbcoldesc[nCol].pclsid = NULL;  
        dbcoldesc[nCol].cPropertySets = 1;  
        dbcoldesc[nCol].ulColumnSize = 0;  
        dbcoldesc[nCol].dbcid.eKind = DBKIND_NAME;  
        dbcoldesc[nCol].wType = DBTYPE_I4;  
        dbcoldesc[nCol].bPrecision = 0;  
        dbcoldesc[nCol].bScale = 0;  
  
        dbcoldesc[nCol].rgPropertySets[0].rgProperties =   
            new DBPROP[NCOLPROPS_MAX];  
        dbcoldesc[nCol].rgPropertySets[0].cProperties = NCOLPROPS_MAX;  
        dbcoldesc[nCol].rgPropertySets[0].guidPropertySet =  
            DBPROPSET_COLUMN;  
  
        for (nProp = 0; nProp < NCOLPROPS_MAX; nProp++)  
            {  
            dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].  
                dwOptions = DBPROPOPTIONS_REQUIRED;  
            dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].colid  
                 = DB_NULLID;  
  
            VariantInit(  
                &(dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].  
                    vValue));  
  
            dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].  
                vValue.vt = VT_BOOL;  
            }  
        }  
  
    // Set the column-specific information.  
    dbcoldesc[0].dbcid.uName.pwszName = L"OrderID";  
    dbcoldesc[0].rgPropertySets[0].rgProperties[0].dwPropertyID =   
        DBPROP_COL_NULLABLE;  
    dbcoldesc[0].rgPropertySets[0].rgProperties[0].vValue.boolVal =   
        VARIANT_FALSE;  
    dbcoldesc[0].rgPropertySets[0].cProperties = 1;  
  
    dbcoldesc[1].dbcid.uName.pwszName = L"ProductID";  
    dbcoldesc[1].rgPropertySets[0].rgProperties[0].dwPropertyID =   
        DBPROP_COL_NULLABLE;  
    dbcoldesc[1].rgPropertySets[0].rgProperties[0].vValue.boolVal =   
        VARIANT_FALSE;  
    dbcoldesc[1].rgPropertySets[0].cProperties = 1;  
  
    dbcoldesc[2].dbcid.uName.pwszName = L"UnitPrice";  
    dbcoldesc[2].wType = DBTYPE_CY;  
    dbcoldesc[2].rgPropertySets[0].rgProperties[0].dwPropertyID =   
        DBPROP_COL_NULLABLE;  
    dbcoldesc[2].rgPropertySets[0].rgProperties[0].vValue.boolVal =   
        VARIANT_FALSE;  
    dbcoldesc[2].rgPropertySets[0].cProperties = 1;  
  
    dbcoldesc[3].dbcid.uName.pwszName = L"Quantity";  
    dbcoldesc[3].rgPropertySets[0].rgProperties[0].dwPropertyID =   
        DBPROP_COL_NULLABLE;  
    dbcoldesc[3].rgPropertySets[0].rgProperties[0].vValue.boolVal =   
        VARIANT_FALSE;  
    dbcoldesc[3].rgPropertySets[0].cProperties = 1;  
  
    dbcoldesc[4].dbcid.uName.pwszName = L"Discount";  
    dbcoldesc[4].wType = DBTYPE_NUMERIC;  
    dbcoldesc[4].bPrecision = 2;  
    dbcoldesc[4].bScale = 2;  
    dbcoldesc[4].rgPropertySets[0].rgProperties[0].dwPropertyID =   
        DBPROP_COL_NULLABLE;  
    dbcoldesc[4].rgPropertySets[0].rgProperties[0].vValue.boolVal =   
        VARIANT_FALSE;  
    dbcoldesc[4].rgPropertySets[0].rgProperties[1].dwPropertyID =   
        DBPROP_COL_DEFAULT;  
    dbcoldesc[4].rgPropertySets[0].rgProperties[1].vValue.vt = VT_BSTR;  
    dbcoldesc[4].rgPropertySets[0].rgProperties[1].vValue.bstrVal =  
        SysAllocString(L"0");  
    dbcoldesc[4].rgPropertySets[0].cProperties = 2;  
  
    // Set up the dbid for OrderDetails.  
    dbidTable.eKind = DBKIND_NAME;  
    dbidTable.uName.pwszName = L"OrderDetails";  
  
    if (FAILED(hr = pITableDefinition->CreateTable(NULL, &dbidTable,  
        nCols, dbcoldesc, NULL, 0, NULL, NULL, NULL)))  
        {  
        DumpError(pITableDefinition, IID_ITableDefinition);  
        goto SAFE_EXIT;  
        }  
  
SAFE_EXIT:  
    // Clean up dynamic allocation in the property sets.  
    for (nCol = 0; nCol < nCols; nCol++)  
        {  
        for (nProp = 0; nProp < NCOLPROPS_MAX; nProp++)  
            {  
            if (dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].  
                vValue.vt == VT_BSTR)  
                {  
                SysFreeString(dbcoldesc[nCol].rgPropertySets[0].  
                    rgProperties[nProp].vValue.bstrVal);  
                }  
            }  
  
        delete [] dbcoldesc[nCol].rgPropertySets[0].rgProperties;  
        delete [] dbcoldesc[nCol].rgPropertySets;  
        }  
  
    return (hr);  
    }  

См. также

Таблицы и индексы