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


Создание таблиц SQL Server

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

Скачать драйвер OLE DB

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

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

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

OLE DB Driver for SQL Server может создавать имена постоянных или временных таблиц. Когда потребитель задает для параметра pTableID значение NULL, а для параметра ppTableID — значение, указывающее на действительный DBID*, драйвер OLE DB для SQL Server возвращает сформированное имя таблицы в члене pwszName объединения uName в DBID, на который указывает значение ppTableID. Для создания временной таблицы, имя для которой сформирует драйвер OLE DB для SQL Server, потребитель включает свойство таблицы OLE DB DBPROP_TBL_TEMPTABLE в набор свойств таблицы, на который указывает параметр rgPropertySets. Названные OLE DB Driver for SQL Server временные таблицы являются локальными.

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

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

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

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

OLE DB Driver for 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 создать таблицу на сервере.

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

Драйвер 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 создать таблицу на сервере.
DBPROP_COL_DESCRIPTION R/W: чтение и запись

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

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

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

Установка свойства не является неустранимой ошибкой для OLE DB Driver for 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 Driver for 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 Driver for SQL Server создать таблицу 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 Driver for SQL Server возвращает ошибку из SQL Server, когда потребитель пытается создать ограничение UNIQUE для столбца недопустимого типа данных SQL Server. Ограничения UNIQUE нельзя определить для столбцов, созданных с помощью типа битовых данных SQL Server.

Когда потребитель вызывает метод ITableDefinition::CreateTable, драйвер OLE DB для SQL Server интерпретирует свойства таблицы указанным ниже образом.

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

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

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

В этом примере создается таблица 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);  
    }  

См. также

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