Freigeben über


Table-Valued Parameter Rowset Creation in SQL Server Native Client

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

Consumer können zwar ein beliebiges Rowsetobjekt für Tabellenwertparameter bereitstellen, typische Rowsetobjekte werden jedoch mit Back-End-Datenspeichern implementiert und bieten somit nur eine eingeschränkte Leistung. Aus diesem Grund ermöglicht der OLE DB-Anbieter von SQL Server Native Client die Erstellung eines speziellen Rowset-Objekts über Speicherdaten. Dieses besondere Rowsetobjekt im Arbeitsspeicher ist ein neues COM-Objekt, das als Tabellenwertparameter für Rowsets bezeichnet wird. Es bietet ähnliche Funktionen wie Parametersätze.

Tabellenwertparameter-Rowsetobjekte werden explizit vom Consumer für Eingabeparameter durch mehrere Schnittstellen auf Sitzungsebene erstellt. Es steht eine Instanz des Tabellenwertparameter-Rowsetobjekts pro Tabellenwertparameter zur Verfügung. Der Consumer kann die Tabellenwertparameter-Rowsetobjekte entweder durch Bereitstellen der Metadateninformationen, die bereits bekannt sind (statisches Szenario), oder durch Ermitteln über Anbieterschnittstellen (dynamisches Szenario) erstellen. In den folgenden Abschnitten werden diese beiden Szenarien beschrieben.

Statisches Szenario

Wenn die Typinformationen bekannt sind, verwendet der Consumer ITableDefinitionWithConstraints::CreateTableWithConstraints, um einen Tabellenwertparameter für Rowsetobjekte zu instanziieren, die einem Tabellenwertparameter entsprechen.

Das guid-Feld (pTableID-Parameter) enthält die besondere GUID (CLSID_ROWSET_TVP). Das Element pwszName enthält den Namen des Tabellenwertparameter-Typs, den der Consumer instanziieren möchte. Das Feld eKin wird auf DBKIND_GUID_NAME festgelegt. Der Name ist erforderlich, wenn es sich um eine Ad-hoc-SQL-Anweisung handelt; bei einem Prozeduraufruf ist die Angabe des Namens optional.

Bei der Aggregation übergibt der Consumer den pUnkOuter-Parameter mit dem kontrollierenden IUnknown-Element.

Die Objekteigenschaften des Rowset-Objekts mit Tabellenwert sind schreibgeschützt, sodass der Consumer keine Eigenschaften in rgPropertySets festlegen wird.

Für das Element rgPropertySets jeder DBCOLUMNDESC-Struktur kann der Consumer zusätzliche Eigenschaften für jede Spalte angeben. Diese Eigenschaften gehören zum DBPROPSET_SQLSERVERCOLUMN-Eigenschaftensatz. Sie ermöglichen es Ihnen, berechnete und standardmäßige Einstellungen für jede Spalte anzugeben. Sie unterstützen auch vorhandene Spalteneigenschaften, z. B. NULL-Zulässigkeit und Identität.

Um entsprechende Informationen aus einem Tabellenwertparameter-Rowsetobjekt abzurufen, verwendet der Consumer IRowsetInfo::GetProperties.

Um Informationen über den Null-, eindeutigen, berechneten und Aktualisierungsstatus jeder Spalte abzurufen, verwenden der Verbraucher IColumnsRowset::GetColumnsRowset oder IColumnsInfo::GetColumnInfo. Diese Methoden stellen ausführliche Informationen über jede Tabellenwertparameter-Rowsetspalte bereit.

Der Consumer gibt den Typ jeder Spalte des Tabellenwertparameters an. Dies ähnelt der Angabe von Spalten, wenn eine Tabelle in SQL Server erstellt wird. Der Consumer ruft über den ppRowset-Ausgabeparameter ein Rowsetobjekt mit Tabellenwert aus dem OLE DB-Anbieter des SQL Server Native Client ab.

Dynamisches Szenario

Wenn der Consumer keine Typinformationen enthält, sollte es IOpenRowset::OpenRowset verwenden, um Zeilensatzobjekte mit Tabellenwert zu instanziieren. Der Consumer muss dem Anbieter somit nur den Typnamen zur Verfügung stellen.

In diesem Szenario erhält der Anbieter im Namen des Consumers Typinformationen zu einem Tabellenwertparameter-Rowsetobjekt vom Server.

Die Parameter pTableID und pUnkOuter sollten wie im statischen Szenario festgelegt werden. Der OLE DB-Anbieter von SQL Server Native Client ruft dann die Typinformationen (Spalteninformationen und Einschränkungen) vom Server ab und gibt ein Rowsetobjekt mit Tabellenwertparametern über den ppRowset-Parameter zurück. Für diesen Vorgang ist eine Kommunikation mit dem Server notwendig, sodass die Leistung nicht so gut ist wie beim statischen Szenario. Das dynamische Szenario funktioniert nur mit parametrisierten Prozeduraufrufen.

Weitere Informationen

Tabellenwertparameter (OLE DB)
Verwenden von Tabellenwertparametern (OLE DB)