Freigeben über


Erstellen von SQL Server-Tabellen

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Analytics Platform System (PDW)

OLE DB-Treiber herunterladen

Der OLE DB-Treiber für SQL Server macht die ITableDefinition::CreateTable-Funktion verfügbar und ermöglicht es Consumern, SQL Server-Tabellen zu erstellen. Consumer verwenden CreateTable zum Erstellen von dauerhaften Tabellen, die vom Consumer benannt werden, und von dauerhaften oder temporären Tabellen, die eindeutige Namen vom OLE DB-Treiber für SQL Server erhalten.

Wenn der Consumer ITableDefinition::CreateTable aufruft und der Wert der Eigenschaft DBPROP_TBL_TEMPTABLE VARIANT_TRUE lautet, erzeugt der OLE DB-Treiber für SQL Server einen temporären Tabellennamen für den Consumer. Der Consumer legt den pTableID-Parameter der CreateTable-Methode auf NULL fest. Die temporären Tabellen, deren Namen vom OLE DB-Treiber für SQL Server erzeugt wurde, werden nicht im TABLES-Rowset angezeigt. Der Zugriff ist über die IOpenRowset-Schnittstelle möglich.

Wenn Consumer den Tabellennamen im pwszName-Element der uName-Union im pTableID-Parameter angeben, erstellt der OLE DB-Treiber für SQL Server eine SQL Server-Tabelle mit diesem Namen. Es gelten die SQL Server-Einschränkungen für Tabellennamen, und der Tabellenname kann eine dauerhafte Tabelle angeben oder entweder eine lokale oder globale temporäre Tabelle. Weitere Informationen finden Sie unter CREATE TABLE. Der ppTableID-Parameter kann NULL sein.

Der OLE DB-Treiber für SQL Server kann die Namen dauerhafter oder temporärer Tabellen generieren. Wenn der Consumer den pTableID-Parameter auf NULL festlegt und ppTableID auf eine gültige DBID* verweisen lässt, gibt der OLE DB-Treiber für SQL Server den generierten Namen der Tabelle im pwszName-Member der uName-Union der DBID zurück, auf die der Wert ppTableID verweist. Um eine temporäre, vom OLE DB-Treiber für SQL Server benannte Tabelle zu erstellen, schließt der Consumer die OLE DB-Tabelleneigenschaft DBPROP_TBL_TEMPTABLE in einen Tabelleneigenschaftensatz ein, auf den imrgPropertySets-Parameter verwiesen wird. Vom OLE DB-Treiber für SQL Server benannte temporäre Tabellen sind lokale Tabellen.

CreateTable gibt DB_E_BADTABLEID zurück, wenn das eKind-Element des pTableID-Parameters nicht DBKIND_NAME angibt.

DBCOLUMNDESC-Verwendung

Der Consumer kann einen Spaltendatentyp durch Verwendung des pwszTypeName-Elements oder des wType-Elements angeben. Wenn der Consumer den Datentyp in pwszTypeName angibt, ignoriert der OLE DB-Treiber für SQL Server den Wert von wType.

Bei Verwendung des pwszTypeName-Elements gibt der Consumer den Datentyp mit SQL Server-Datentypnamen an. Gültige Datentypnamen sind die, die in der Spalte TYPE_NAME des PROVIDER_TYPES-Schemarowsets zurückgegeben werden.

Der OLE DB-Treiber für SQL Server erkennt eine Teilmenge der von OLE DB aufgelisteten DBTYPE-Werten im wType-Element. Weitere Informationen finden Sie unter Datentypzuordnung in ITableDefinition.

Hinweis

CreateTable gibt DB_E_BADTYPE zurück, wenn der Consumer das pTypeInfo- oder pclsid-Element zur Angabe des Spaltendatentyps verwendet.

Der Consumer gibt dne Spaltennamen im pwszName-Element der uName-Union des DBCOLUMNDESC dbcid-Elements an. Der Spaltenname wird als Unicode-Zeichenfolge angegeben. Das eKind-Element von dbcid muss DBKIND_NAME sein. CreateTable gibt DB_E_BADCOLUMNID zurück, wenn eKind ungültig ist,pwszName NULL ist oder der Wert von pwszName kein gültiger SQL Server-Bezeichner ist.

Alle Spalteneigenschaften sind in allen für die Tabelle definierten Spalten verfügbar. CreateTable kann DB_S_ERRORSOCCURRED oder DB_E_ERRORSOCCURRED zurückgeben, wenn Eigenschaftenwerte zu Konflikten führen. CreateTable gibt einen Fehler zurück, wenn ungültige Spalteneigenschaften Fehler bei der SQL Server-Tabellenerstellung verursachen.

Spalteneigenschaften in DBCOLUMNDESC werden wie folgt interpretiert.

Eigenschafts-ID BESCHREIBUNG
DBPROP_COL_AUTOINCREMENT R/W: Lesen/Schreiben

Standardwert: VARIANT_FALSE, Beschreibung: Legt die Identitätseigenschaft für die erstellte Spalte fest. Für SQL Server ist die IDENTITY-Eigenschaft für eine einzelne Spalte innerhalb einer Tabelle gültig. Wenn Sie die Eigenschaft für mehrere Spalten auf VARIANT_TRUE festlegen, wird ein Fehler gemeldet, wenn der OLE DB-Treiber für SQL Server versucht, die Tabelle auf dem Server zu erstellen.

Die SQL Server-Identitätseigenschaft ist nur für integer-, numeric- und decimal-Typen gültig wenn der Dezimalstellenwert 0 (null) ist. Wenn Sie die Eigenschaft für eine Spalte eines anderen Datentyps auf VARIANT_TRUE festlegen, wird ein Fehler gemeldet, wenn der OLE DB-Treiber für SQL Server versucht, die Tabelle auf dem Server zu erstellen.

Der OLE DB-Treiber für SQL Server gibt DB_S_ERRORSOCCURRED zurück, wenn sowohl DBPROP_COL_AUTOINCREMENT als auch DBPROP_COL_NULLABLE den Wert VARIANT_TRUE haben und dwOption von DBPROP_COL_NULLABLE nicht DBPROPOPTIONS_REQUIRED ist. DB_E_ERRORSOCCURRED wird zurückgegeben, wenn sowohl DBPROP_COL_AUTOINCREMENT als auch DBPROP_COL_NULLABLE den Wert VARIANT_TRUE haben und dwOption von DBPROP_COL_NULLABLE gleich DBPROPOPTIONS_REQUIRED ist. Die Spalte wird mit der SQL Server-Identitätseigenschaft definiert, und das DBPROP_COL_NULLABLE dwStatus-Element wird auf DBPROPSTATUS_CONFLICTING festgelegt.
DBPROP_COL_DEFAULT R/W: Lesen/Schreiben

Standardwert: Keine

Beschreibung: Erstellt eine SQL Server DEFAULT-Einschränkung für die Spalte.

Das vValue DBPROP-Element kann verschiedenen Typen entsprechen. Das vValue.vt-Element sollte einen Typ angeben, der mit dem Datentyp der Spalte kompatibel ist. Beispielsweise ist BSTR N/A als Standardwert für eine Spalte geeignet, die als DBTYPE_WSTR definiert ist. Wenn Sie denselben Standard für eine Spalte festlegen, die als DBTYPE_R8 definiert ist, wird ein Fehler gemeldet, wenn der OLE DB-Treiber für SQL Server versucht, die Tabelle auf dem Server zu erstellen.
DBPROP_COL_DESCRIPTION R/W: Lesen/Schreiben

Standardwert: Keine

Beschreibung: Die Spalteneigenschaft DBPROP_COL_DESCRIPTION wird nicht vom OLE DB-Treiber für SQL Server implementiert.

Das dwStatus-Element der DBPROP-Struktur gibt DBPROPSTATUS_NOTSUPPORTED zurück, wenn der Consumer versucht, den Eigenschaftenwert zu schreiben.

Das Festlegen der Eigenschaft stellt keinen schwerwiegenden Fehler für den OLE DB-Treiber für SQL Server dar. Wenn alle anderen Parameterwerte gültig sind, wird die SQL Server-Tabelle erstellt.
DBPROP_COL_FIXEDLENGTH R/W: Lesen/Schreiben

Standardwert: VARIANT_FALSE

Beschreibung: Der OLE DB-Treiber für SQL Server verwendet DBPROP_COL_FIXEDLENGTH, um die Datentypzuordnung zu bestimmen, wenn der Consumer einen Spaltendatentyp mithilfe des wType-Elements von DBCOLUMNDESC definiert. Weitere Informationen finden Sie unter Datentypzuordnung in ITableDefinition.
DBPROP_COL_NULLABLE R/W: Lesen/Schreiben

Standardwert: Keine

Beschreibung: Beim Erstellen der Tabelle gibt der OLE DB-Treiber für SQL Server an, ob die Spalte NULL-Werte akzeptieren soll, falls die Eigenschaft festgelegt ist. Ist die Eigenschaft nicht festgelegt, wird durch die SQL Server ANSI_NULLS-Standarddatenbankoption festgelegt, ob die Spalte NULL-Werte akzeptiert.

Der OLE DB Treiber für SQL Server ist ein ISO-konformer Anbieter. Verbundene Sitzungen weisen ISO-Verhalten auf. Wenn der Consumer DBPROP_COL_NULLABLE nicht festlegt, akzeptieren die Spalten NULL-Werte.
DBPROP_COL_PRIMARYKEY R/W: Lesen/Schreiben

Standardwert: VARIANT_FALSE, Beschreibung: Bei Festlegung auf VARIANT_TRUE erstellt der OLE DB-Treiber für SQL Server die Spalte mit einer PRIMARY KEY-Einschränkung.

Wenn sie als Spalteneigenschaft definiert ist, kann nur eine einzelne Spalte die Einschränkung bestimmen. Wenn Sie die Eigenschaft für mehrere Spalten auf VARIANT_TRUE festlegen, wird ein Fehler zurückgegeben, wenn der OLE DB-Treiber für SQL Server versucht, die SQL Server-Tabelle zu erstellen.

Hinweis: Der Consumer kann IIndexDefinition::CreateIndex verwenden, um eine PRIMARY KEY-Einschränkung für zwei oder mehr Spalten zu erstellen.

Der OLE DB-Treiber für SQL Server gibt DB_S_ERRORSOCCURRED zurück, wenn sowohl DBPROP_COL_PRIMARYKEY als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption von DBPROP_COL_UNIQUE nicht DBPROPOPTIONS_REQUIRED ist.

DB_E_ERRORSOCCURRED wird zurückgegeben, wenn sowohl DBPROP_COL_PRIMARYKEY als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption von DBPROP_COL_UNIQUE gleich DBPROPOPTIONS_REQUIRED ist. Die Spalte wird mit der SQL Server-Identitätseigenschaft definiert, und das DBPROP_COL_PRIMARYKEY dwStatus-Element wird auf DBPROPSTATUS_CONFLICTING festgelegt.

Der OLE DB-Treiber für SQL Server gibt einen Fehler zurück, wenn sowohl DBPROP_COL_PRIMARYKEY als auch DBPROP_COL_NULLABLE den Wert VARIANT_TRUE hat.

Der OLE DB-Treiber für SQL Server gibt einen Fehler von SQL Server zurück, wenn der Consumer versucht, eine PRIMARY KEY-Einschränkung für eine Spalte mit einem ungültigen SQL Server-Datentyp zu erstellen. PRIMARY KEY-Einschränkungen können nicht für Spalten definiert werden, die mit den SQL Server-Datentypen bit, text, ntext und image erstellt wurden.
DBPROP_COL_UNIQUE R/W: Lesen/Schreiben

Standardwert: VARIANT_FALSE, Beschreibung: Wendet eine SQL Server UNIQUE-Einschränkung auf die Spalte an.

Wenn sie als Spalteneigenschaft definiert ist, wird die Einschränkung nur auf eine einzelne Spalte angewendet. Der Consumer kann IIndexDefinition::CreateIndex verwenden, um eine UNIQUE-Einschränkung auf kombinierte Werte von zwei oder mehr Spalten anzuwenden.

Der OLE DB-Treiber für SQL Server gibt DB_S_ERRORSOCCURRED zurück, wenn sowohl DBPROP_COL_PRIMARYKEY als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption nicht DBPROPOPTIONS_REQUIRED ist.

DB_E_ERRORSOCCURRED wird zurückgegeben, wenn sowohl DBPROP_COL_PRIMARYKEY als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption gleich DBPROPOPTIONS_REQUIRED ist. Die Spalte wird mit der SQL Server-Identitätseigenschaft definiert, und das DBPROP_COL_PRIMARYKEY dwStatus-Element wird auf DBPROPSTATUS_CONFLICTING festgelegt.

Der OLE DB-Treiber für SQL Server gibt DB_S_ERRORSOCCURRED zurück, wenn sowohl DBPROP_COL_NULLABLE als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption nicht DBPROPOPTIONS_REQUIRED ist.

DB_E_ERRORSOCCURRED wird zurückgegeben, wenn sowohl DBPROP_COL_NULLABLE als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption gleich DBPROPOPTIONS_REQUIRED ist. Die Spalte wird mit der SQL Server-Identitätseigenschaft definiert, und das DBPROP_COL_NULLABLE dwStatus-Element wird auf DBPROPSTATUS_CONFLICTING festgelegt.

Der OLE DB-Treiber für SQL Server gibt einen Fehler von SQL Server zurück, wenn der Consumer versucht, eine UNIQUE-Einschränkung für eine Spalte mit einem ungültigen SQL Server-Datentyp zu erstellen. UNIQUE-Einschränkungen können nicht für Spalten definiert werden, die mit dem SQL Server bit-Datentyp erstellt wurden.

Wenn der Consumer ITableDefinition::CreateTable aufruft, interpretiert der OLE DB Treiber für SQL Server Tabelleneigenschaften wie folgt.

Eigenschafts-ID BESCHREIBUNG
DBPROP_TBL_TEMPTABLE R/W: Lesen/Schreiben

Standardwert: VARIANT_FALSE, Beschreibung: Standardmäßig erstellt der OLE DB-Treiber für SQL Server Tabellen, die durch den Consumer benannt sind. Bei Festlegung auf VARIANT_TRUE generiert der OLE DB-Treiber für SQL Server einen temporären Tabellennamen für den Consumer. Der Consumer legt den pTableID-Parameter von CreateTable auf NULL fest. Der ppTableID-Parameter muss einen gültigen Zeiger enthalten.

Wenn der Consumer das Öffnen eines Rowsets für eine erfolgreich erstellte Tabelle anfordert, öffnet der OLE DB-Treiber für SQL Server ein durch Cursor unterstütztes Rowset. Alle Rowseteigenschaften können in den übergebenen Eigenschaftensätzen angegeben werden.

Mit diesem Beispiel wird eine SQL Server-Tabelle erstellt.

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

Weitere Informationen

Tabellen und Indizes