Crear tablas de SQL Server

El proveedor OLE DB de SQL Server Native Client expone la función ITableDefinition::CreateTable, lo que permite a los consumidores crear tablas de SQL Server. Los consumidores utilizan CreateTable para crear tablas permanentes denominadas por el 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 del 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 de 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 tabla en el miembro pwszName de la unión uName en el parámetro pTableID, el proveedor OLE DB de SQL Server Native Client crea una tabla de 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 de 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 señale a un DBID válido *, el proveedor OLE DB de SQL Server Native Client devuelve el nombre generado de la tabla en el miembro pwszName de la unión uName del DBID al que el valor de ppTableID señala. Para crear una tabla denominada por el proveedor OLE DB de SQL Server Native Client, el consumidor incluye la propiedad de tabla DBPROP_TBL_TEMPTABLE de OLE DB en un conjunto de propiedades de tabla al que se hace referencia en el parámetro rgPropertySets. Las tablas temporales denominadas por el proveedor OLE DB de SQL Server Native Client 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 utilizando 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 utiliza el miembro pwszTypeName, el consumidor especifica el tipo de datos utilizando 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 de SQL Server Native Client reconoce un subconjunto de valores DBTYPE enumerados por OLE DB en el miembro wType. Para obtener más información, vea Asignación de tipos de datos en ITableDefinition.

[!NOTA]

CreateTable devuelve DB_E_BADTYPE si el consumidor establece el miembro pclsid o pTypeInfo 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

L/E: de lectura/escritura

Valor predeterminado: VARIANT_FALSE. Descripción: 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. Al establecer la propiedad en VARIANT_TRUE para más de una columna única, se genera un error cuando el proveedor OLE DB de 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 de SQL Server Native Client intenta crear la tabla en el servidor.

El proveedor OLE DB de 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 es 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 dwStatus de DBPROP_COL_NULLABLE se establece en DBPROPSTATUS_CONFLICTING.

DBPROP_COL_DEFAULT

L/E: de lectura/escritura

Valor predeterminado: ninguno

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

El miembro vValue DBPROP puede ser cualquiera de varios tipos. El miembro vValue.vt debe 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 de SQL Server Native Client intenta crear la tabla en el servidor.

DBPROP_COL_DESCRIPTION

L/E: de lectura/escritura

Valor predeterminado: ninguno

Descripción: el proveedor OLE DB de SQL Server Native Client 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

L/E: de lectura/escritura

Valor predeterminado: VARIANT_FALSE

Descripción: el proveedor OLE DB de SQL Server Native Client utiliza DBPROP_COL_FIXEDLENGTH para determinar la asignación de tipo de datos cuando el consumidor define el tipo de datos de una columna utilizando el miembro wType de DBCOLUMNDESC. Para obtener más información, vea Asignación de tipos de datos en ITableDefinition.

DBPROP_COL_NULLABLE

L/E: de lectura/escritura

Valor predeterminado: ninguno

Descripción: al crear la tabla, el proveedor OLE DB de SQL Server Native Client indica si la columna debe aceptar valores nulos 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

L/E: de lectura/escritura

Valor predeterminado: VARIANT_FALSE. Descripción: cuando 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. Al establecer la propiedad VARIANT_TRUE para más que una columna única, se devuelve un error cuando el proveedor OLE DB de SQL Server Native Client intenta crear la tabla de SQL Server.

Nota: el consumidor puede utilizar IIndexDefinition::CreateIndex para crear una restricción PRIMARY KEY en 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 de DBPROP_COL_UNIQUE no es 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 de SQL Server Native Client devuelve un error cuando DBPROP_COL_PRIMARYKEY y DBPROP_COL_NULLABLE son ambos VARIANT_TRUE.

El proveedor OLE DB de SQL Server Native Client devuelve un error de SQL Server cuando el consumidor intenta crear una restricción PRIMARY KEY en una columna de un tipo de datos de 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

L/E: de lectura/escritura

Valor predeterminado: VARIANT_FALSE. Descripción: 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 utilizar 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 es 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 es 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 dwStatus de DBPROP_COL_NULLABLE se establece en DBPROPSTATUS_CONFLICTING.

El proveedor OLE DB de SQL Server Native Client devuelve un error de SQL Server cuando el consumidor intenta crear una restricción UNIQUE en una columna de un tipo de datos de 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 de SQL Server Native Client interpreta las propiedades de la tabla como sigue.

Id. de propiedad

Descripción

DBPROP_TBL_TEMPTABLE

L/E: de 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 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 de CreateTable en NULL. El parámetro ppTableID debe 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);
    }

Vea también

Conceptos

Tablas e índices