Creación de tablas de SQL Server Native Client

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

El proveedor OLE DB SQL Server Native Client expone la función ITableDefinition::CreateTable, lo que permite a los consumidores crear tablas SQL Server. Los consumidores usan CreateTable para crear tablas permanentes con nombre de consumidor y tablas permanentes o temporales con nombres únicos generados por el proveedor OLE DB de SQL Server Native Client.

Cuando el consumidor llama a ITableDefinition::CreateTable, si el valor de la propiedad DBPROP_TBL_TEMPTABLE es VARIANT_TRUE, el proveedor OLE DB de SQL Server Native Client genera un nombre de tabla temporal para el consumidor. El consumidor establece el parámetro pTableID del método CreateTable en NULL. Las tablas temporales con nombres generados por el proveedor OLE DB SQL Server Native Client no aparecen en el conjunto de filas TABLES, pero son accesibles a través de la interfaz IOpenRowset.

Cuando los consumidores especifican el nombre de la tabla en el miembro pwszName de la unión uName en el parámetro pTableID, el proveedor OLE DB SQL Server Native Client crea una tabla SQL Server con ese nombre. Se aplican las restricciones de denominación de tabla de SQL Server y el nombre de tabla puede indicar una tabla permanente o una tabla temporal local o global. Para obtener más información, vea CREATE TABLE. El parámetro ppTableID puede ser NULL.

El proveedor OLE DB SQL Server Native Client puede generar los nombres de tablas permanentes o temporales. Cuando el consumidor establece el parámetro pTableID en NULL y establece ppTableID para que apunte a un DBID*válido, el proveedor OLE DB SQL Server Native Client devuelve el nombre generado de la tabla en el miembro pwszName de la unión uName del DBID al que apunta el valor de ppTableID. Para crear una tabla temporal, SQL Server Native Client con nombre del proveedor OLE DB, el consumidor incluye la propiedad de tabla OLE DB DBPROP_TBL_TEMPTABLE en un conjunto de propiedades de tabla al que se hace referencia en el parámetro rgPropertySets. SQL Server Native Client las tablas temporales con nombre del proveedor OLE DB son locales.

CreateTable devuelve DB_E_BADTABLEID si el miembro eKind del parámetro pTableID no indica DBKIND_NAME.

Uso de DBCOLUMNDESC

El consumidor puede indicar un tipo de datos de columna con el miembro pwszTypeName o el miembro wType. Si el consumidor especifica el tipo de datos en pwszTypeName, el proveedor OLE DB de SQL Server Native Client omite el valor de wType.

Si usa el miembro pwszTypeName, el consumidor especifica el tipo de datos con los nombres de tipo de datos de SQL Server. Los nombres de tipo de datos válidos son aquéllos devueltos en la columna TYPE_NAME del conjunto de filas de esquema PROVIDER_TYPES.

El proveedor OLE DB SQL Server Native Client reconoce un subconjunto de valores DBTYPE enumerados por OLE DB en el miembro wType. Para más información, consulte Asignación de tipos de datos en ITableDefinition.

Nota:

CreateTable devuelve DB_E_BADTYPE si el consumidor establece el miembro pTypeInfo o pclsid para especificar el tipo de datos de columna.

El consumidor especifica el nombre de columna en el miembro pwszName de la unión uName del miembro dbcid de DBCOLUMNDESC. El nombre de columna se especifica como una cadena de caracteres Unicode. El miembro eKind de dbcid debe ser DBKIND_NAME. CreateTable devuelve DB_E_BADCOLUMNID si eKind no es válido, pwszName es NULL o si el valor de pwszName no es un identificador de SQL Server válido.

Todas las propiedades de columna están disponibles en todas las columnas definidas para la tabla. CreateTable puede devolver DB_S_ERRORSOCCURRED o DB_E_ERRORSOCCURRED si los valores de la propiedad se han establecido de un modo que están en conflicto. CreateTable devuelve un error cuando la configuración de la propiedad de columna no válida produce un error en la creación de la tabla de SQL Server.

Las propiedades de columna de un DBCOLUMNDESC se interpretan como sigue.

Id. de propiedad Descripción
DBPROP_COL_AUTOINCREMENT R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: Descripción de VARIANT_FALSE: Establece la propiedad de identidad en la columna creada. Para SQL Server, la propiedad de identidad es válida para una columna única dentro de una tabla. Si se establece la propiedad en VARIANT_TRUE para más de una sola columna, se genera un error cuando el proveedor OLE DB SQL Server Native Client intenta crear la tabla en el servidor.

La propiedad de identidad de SQL Server solo es válida para los tipos de datos integer, numeric y decimal cuando la escala es 0. Al establecer la propiedad en VARIANT_TRUE en una columna de cualquier otro tipo de datos, se genera un error cuando el proveedor OLE DB SQL Server Native Client intenta crear la tabla en el servidor.

El proveedor OLE DB SQL Server Native Client devuelve DB_S_ERRORSOCCURRED cuando DBPROP_COL_AUTOINCREMENT y DBPROP_COL_NULLABLE son VARIANT_TRUE y dwOption de DBPROP_COL_NULLABLE no se DBPROPOPTIONS_REQUIRED. Se devuelve DB_E_ERRORSOCCURRED cuando DBPROP_COL_AUTOINCREMENT y DBPROP_COL_NULLABLE son VARIANT_TRUE y dwOption de DBPROP_COL_NULLABLE es igual a DBPROPOPTIONS_REQUIRED. La columna se define con la propiedad de identidad de SQL Server y el miembro DBPROP_COL_NULLABLE de dwStatus se establece en DBPROPSTATUS_CONFLICTING.
DBPROP_COL_DEFAULT R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

Descripción: crea una restricción DEFAULT de SQL Server para la columna.

El miembro DBPROP de vValue puede ser cualquiera de varios tipos. El miembro vValue.vt tiene que especificar un tipo compatible con el tipo de datos de la columna. Por ejemplo, la definición de BSTR N/A como el valor predeterminado para una columna definida como DBTYPE_WSTR es una coincidencia compatible. La definición del mismo valor predeterminado en una columna definida como DBTYPE_R8 genera un error cuando el proveedor OLE DB SQL Server Native Client intenta crear la tabla en el servidor.
DBPROP_COL_DESCRIPTION R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

Descripción: el proveedor SQL Server Native Client OLE DB no implementa la propiedad de columna DBPROP_COL_DESCRIPTION.

El miembro dwStatus de la estructura DBPROP devuelve DBPROPSTATUS_NOTSUPPORTED cuando el consumidor intenta escribir el valor de propiedad.

Establecer la propiedad no constituye un error irrecuperable para el proveedor OLE DB de SQL Server Native Client. Si todos los demás valores de parámetro son válidos, se crea la tabla de SQL Server.
DBPROP_COL_FIXEDLENGTH R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: VARIANT_FALSE

Descripción: el proveedor OLE DB de SQL Server Native Client usa DBPROP_COL_FIXEDLENGTH para determinar la asignación de tipos de datos cuando el consumidor define el tipo de datos de una columna mediante el miembro wType del DBCOLUMNDESC. Para más información, consulte Asignación de tipos de datos en ITableDefinition.
DBPROP_COL_NULLABLE R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

Descripción: al crear la tabla, el proveedor OLE DB SQL Server Native Client indica si la columna debe aceptar valores NULL si se establece la propiedad . Cuando no se establece la propiedad, la capacidad de la columna de aceptar valores NULL como valores está determinada por la opción de base de datos predeterminada ANSI_NULLS de SQL Server.

El proveedor OLE DB de SQL Server Native Client es un proveedor compatible con ISO. Las sesiones conectadas exhiben los comportamientos ISO. Si el consumidor no establece DBPROP_COL_NULLABLE, las columnas aceptan valores nulos.
DBPROP_COL_PRIMARYKEY R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: VARIANT_FALSE Descripción: al VARIANT_TRUE, el proveedor OLE DB de SQL Server Native Client crea la columna con una restricción PRIMARY KEY.

Cuando se define como una propiedad de columna, solo una columna única puede determinar la restricción. Si se establece la propiedad VARIANT_TRUE para más de una sola columna, se devuelve un error cuando el proveedor OLE DB SQL Server Native Client intenta crear la tabla SQL Server.

Nota: El consumidor puede usar IIndexDefinition::CreateIndex para crear una restricción PRIMARY KEY sobre dos o más columnas.

El proveedor OLE DB SQL Server Native Client devuelve DB_S_ERRORSOCCURRED cuando DBPROP_COL_PRIMARYKEY y DBPROP_COL_UNIQUE son VARIANT_TRUE y dwOption de DBPROP_COL_UNIQUE no se DBPROPOPTIONS_REQUIRED.

Se devuelve DB_E_ERRORSOCCURRED cuando DBPROP_COL_PRIMARYKEY y DBPROP_COL_UNIQUE son VARIANT_TRUE y dwOption de DBPROP_COL_UNIQUE es igual a DBPROPOPTIONS_REQUIRED. La columna se define con la propiedad de identidad de SQL Server y el miembro dwStatus de DBPROP_COL_PRIMARYKEY se establece en DBPROPSTATUS_CONFLICTING.

El proveedor OLE DB SQL Server Native Client devuelve un error cuando DBPROP_COL_PRIMARYKEY y DBPROP_COL_NULLABLE son VARIANT_TRUE.

El proveedor OLE DB SQL Server Native Client devuelve un error de SQL Server cuando el consumidor intenta crear una restricción PRIMARY KEY en una columna de tipo de datos SQL Server no válido. No se pueden definir restricciones PRIMARY KEY en las columnas creadas con los tipos de datos bit, text, ntext e image de SQL Server.
DBPROP_COL_UNIQUE R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: Descripción de VARIANT_FALSE: aplica una restricción UNIQUE de SQL Server a la columna.

Cuando se define como una propiedad de columna, la restricción solo se aplica en una columna única. El consumidor puede usar IIndexDefinition::CreateIndex para aplicar una restricción UNIQUE en los valores combinados de dos o más columnas.

El proveedor OLE DB de SQL Server Native Client devuelve DB_S_ERRORSOCCURRED cuando DBPROP_COL_PRIMARYKEY y DBPROP_COL_UNIQUE son VARIANT_TRUE y dwOption no se DBPROPOPTIONS_REQUIRED.

Se devuelve DB_E_ERRORSOCCURRED cuando DBPROP_COL_PRIMARYKEY y DBPROP_COL_UNIQUE son VARIANT_TRUE y dwOption es igual a DBPROPOPTIONS_REQUIRED. La columna se define con la propiedad de identidad de SQL Server y el miembro dwStatus de DBPROP_COL_PRIMARYKEY se establece en DBPROPSTATUS_CONFLICTING.

El proveedor OLE DB de SQL Server Native Client devuelve DB_S_ERRORSOCCURRED cuando DBPROP_COL_NULLABLE y DBPROP_COL_UNIQUE son VARIANT_TRUE y dwOption no se DBPROPOPTIONS_REQUIRED.

Se devuelve DB_E_ERRORSOCCURRED cuando DBPROP_COL_NULLABLE y DBPROP_COL_UNIQUE son VARIANT_TRUE y dwOption es igual a DBPROPOPTIONS_REQUIRED. La columna se define con la propiedad de identidad de SQL Server y el miembro DBPROP_COL_NULLABLE de dwStatus se establece en DBPROPSTATUS_CONFLICTING.

El proveedor OLE DB SQL Server Native Client devuelve un error de SQL Server cuando el consumidor intenta crear una restricción UNIQUE en una columna de tipo de datos SQL Server no válido. No se pueden definir restricciones UNIQUE en las columnas creadas con el tipo de datos bit de SQL Server.

Cuando el consumidor llama a ITableDefinition::CreateTable, el proveedor OLE DB SQL Server Native Client interpreta las propiedades de la tabla de la siguiente manera.

Id. de propiedad Descripción
DBPROP_TBL_TEMPTABLE R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: VARIANT_FALSE Descripción: de forma predeterminada, el proveedor OLE DB de SQL Server Native Client crea tablas denominadas por el consumidor. Cuando VARIANT_TRUE, el proveedor OLE DB de SQL Server Native Client genera un nombre de tabla temporal para el consumidor. El consumidor establece el parámetro pTableID de CreateTable en NULL. El parámetro ppTableID tiene que contener un puntero válido.

Si el consumidor solicita que se abra un conjunto de filas en una tabla creada correctamente, el proveedor OLE DB de SQL Server Native Client abre un conjunto de filas compatible con cursores. Las propiedades del conjunto de filas se pueden indicar en los conjuntos de propiedades pasados.

En este ejemplo se crea una tabla de 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);  
    }  

Consulte también

Tablas e índices