Erstellen von nativen SQL Server-Clienttabellen
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Der OLE DB-Anbieter von SQL Server Native Client macht die Funktion "ITableDefinition::CreateTable " verfügbar, sodass Verbraucher SQL Server-Tabellen erstellen können. Consumer verwenden CreateTable zum Erstellen von permanenten Tabellen mit Consumernamen sowie permanente oder temporäre Tabellen mit eindeutigen Namen, die vom SQL Server Native Client OLE DB-Anbieter generiert werden.
Wenn der Consumer ITableDefinition::CreateTable aufruft, wenn der Wert der DBPROP_TBL_TEMPTABLE-Eigenschaft VARIANT_TRUE ist, generiert der OLE DB-Anbieter von SQL Server Native Client einen temporären Tabellennamen für den Consumer. Der Consumer legt den pTableID-Parameter der CreateTable-Methode auf NULL fest. Die temporären Tabellen mit Namen, die vom OLE DB-Anbieter für SQL Server Native Client generiert werden, werden nicht im TABLES-Rowset angezeigt, sind aber über die IOpenRowset-Schnittstelle zugänglich.
Wenn Consumer den Tabellennamen im pwszName-Member der uName-Union im pTableID-Parameter angeben, erstellt der OLE DB-Anbieter von SQL Server Native Client 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-Anbieter von SQL Server Native Client kann die Namen dauerhafter oder temporärer Tabellen generieren. Wenn der Consumer den pTableID-Parameter auf NULL festlegt und ppTableID so festlegt, dass er auf ein gültiges DBID* zeigt, gibt der OLE DB-Anbieter von SQL Server Native Client den generierten Namen der Tabelle im pwszName-Member der uName-Union des DBID zurück, auf den der Wert von ppTableID verweist. Zum Erstellen einer temporären, vom ANBIETER benannten SQL Server Native Client OLE DB-Tabelle enthält der Consumer die OLE DB-Tabelleneigenschaft DBPROP_TBL_TEMPTABLE in einem Tabelleneigenschaftensatz, auf den im rgPropertySets-Parameter verwiesen wird. SQL Server Native Client OLE DB vom Anbieter benannte temporäre Tabellen sind lokal.
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-Anbieter von SQL Server Native Client 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-Anbieter von SQL Server Native Client erkennt eine Teilmenge der aufgezählten OLE DBTYPE-Werte 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 die Eigenschaft für mehr als eine einzelne Spalte auf VARIANT_TRUE festgelegt wird, wird ein Fehler generiert, wenn der OLE DB-Anbieter von SQL Server Native Client 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 Die Eigenschaft auf VARIANT_TRUE in einer Spalte eines anderen Datentyps festgelegt wird, wird ein Fehler generiert, wenn der OLE DB-Anbieter von SQL Server Native Client versucht, die Tabelle auf dem Server zu erstellen. Der OLE DB-Anbieter von SQL Server Native Client gibt DB_S_ERRORSOCCURRED zurück, wenn DBPROP_COL_AUTOINCREMENT und DBPROP_COL_NULLABLE sowohl VARIANT_TRUE sind als auch die 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. Beim Definieren desselben Standardwerts für eine Spalte, die als DBTYPE_R8 definiert ist, wird ein Fehler generiert, wenn der OLE DB-Anbieter von SQL Server Native Client versucht, die Tabelle auf dem Server zu erstellen. |
DBPROP_COL_DESCRIPTION | R/W: Lesen/Schreiben Standardwert: Keine Beschreibung: Die DBPROP_COL_DESCRIPTION Spalteneigenschaft wird nicht vom SQL Server Native Client OLE DB-Anbieter 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-Anbieter des SQL Server Native Client 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-Anbieter von SQL Server Native Client verwendet DBPROP_COL_FIXEDLENGTH, um die Datentypzuordnung zu bestimmen, wenn der Consumer den Datentyp einer Spalte mithilfe des wType-Members des 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-Anbieter von SQL Server Native Client an, ob die Spalte NULL-Werte akzeptieren soll, wenn 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-Anbieter von SQL Server Native Client ist ein ISO-kompatibler 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 Standard: VARIANT_FALSE Beschreibung: Wenn VARIANT_TRUE, erstellt der OLE DB-Anbieter von SQL Server Native Client die Spalte mit einer PRIMARY KEY-Einschränkung. Wenn sie als Spalteneigenschaft definiert ist, kann nur eine einzelne Spalte die Einschränkung bestimmen. Das Festlegen der Eigenschaft VARIANT_TRUE für mehr als eine einzelne Spalte gibt einen Fehler zurück, wenn der OLE DB-Anbieter von SQL Server Native Client 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-Anbieter von SQL Server Native Client gibt DB_S_ERRORSOCCURRED zurück, wenn DBPROP_COL_PRIMARYKEY und DBPROP_COL_UNIQUE sowohl VARIANT_TRUE sind als auch die 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-Anbieter von SQL Server Native Client gibt einen Fehler zurück, wenn DBPROP_COL_PRIMARYKEY und DBPROP_COL_NULLABLE beide VARIANT_TRUE sind. Der OLE DB-Anbieter von SQL Server Native Client gibt einen Fehler von SQL Server zurück, wenn der Consumer versucht, eine PRIMARY KEY-Einschränkung für eine Spalte mit ungültigem 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-Anbieter von SQL Server Native Client gibt DB_S_ERRORSOCCURRED zurück, wenn DBPROP_COL_PRIMARYKEY und DBPROP_COL_UNIQUE sowohl VARIANT_TRUE als auch dwOption nicht DBPROPOPTIONS_REQUIRED sind. 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-Anbieter des SQL Server Native Client gibt DB_S_ERRORSOCCURRED zurück, wenn DBPROP_COL_NULLABLE und DBPROP_COL_UNIQUE sowohl VARIANT_TRUE als auch dwOption nicht DBPROPOPTIONS_REQUIRED sind. 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-Anbieter von SQL Server Native Client gibt einen Fehler von SQL Server zurück, wenn der Consumer versucht, eine UNIQUE-Einschränkung für eine Spalte mit ungültigem 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-Anbieter von SQL Server Native Client Tabelleneigenschaften wie folgt.
Eigenschafts-ID | BESCHREIBUNG |
---|---|
DBPROP_TBL_TEMPTABLE | R/W: Lesen/Schreiben Standard: VARIANT_FALSE Beschreibung: Standardmäßig erstellt der OLE DB-Anbieter von SQL Server Native Client Tabellen, die vom Consumer benannt werden. Wenn VARIANT_TRUE, generiert der OLE DB-Anbieter des SQL Server Native Client 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 anfordert, dass ein Rowset in einer erfolgreich erstellten Tabelle geöffnet wird, öffnet der OLE DB-Anbieter von SQL Server Native Client ein cursorgestü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);
}