Infoga data i Table-Valued parametrar

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-databas i Microsoft Fabric

Ladda ned OLE DB-drivrutins

OLE DB-drivrutinen för SQL Server stöder två modeller för konsumenten att specificera data för tabellvärda parameterrader: en push-modell och en pull-modell.

Anmärkning

En tabellvärd parameterkolumn måste ha antingen icke-standardvärden i alla rader eller standardvärden i alla rader. Det är inte möjligt att ha standardvärden i vissa rader men inte i andra. Därför är de enda statusvärden som tillåts för tabellvärda parameterraduppsättningsdata DBSTATUS_S_ISNULL och DBSTATUS_S_OK i tabellvärda parameterbindningar. DBSTATUS_S_DEFAULT kommer att resultera i ett fel och det bundna statusvärdet sätts till DBSTATUS_E_BADSTATUS.

Push-modell (laddar all parameterdata Table-Valued minnet)

Push-modellen liknar användningen av parameteruppsättningar (det vill säga DBPARAMS-parametern i ICommand::Execute). Push-modellen används endast om tabellvärda parameter-radsetobjekt används utan en anpassad implementation av IRowset-gränssnitt. Push-modellen rekommenderas när antalet rader i tabellvärda parameterraduppsättningen är litet och inte förväntas lägga för överdrivet minnestryck på applikationen. Detta är enklare än pull-modellen, eftersom den inte kräver mer funktionalitet från konsumentapplikationen än vad som för närvarande är vanligt i typiska OLE DB-applikationer.

Konsumenten förväntas tillhandahålla all tabellvärd parameterdata till leverantören innan ett kommando exekveras. För att tillhandahålla data fyller konsumenten i ett tabellvärd parameter-radsetsobjekt för varje tabellvärd parameter. Tabellvärda parameter-radsetobjektet exponerar radset-insert-, set- och delete-operationer, vilka konsumenten använder för att manipulera tabellvärdesparameterdata. Leverantören hämtar data från detta tabellvärda parameter-radsetobjekt vid exekveringstidpunkten.

När ett tabellvärd parameter-radsetobjekt tillhandahålls konsumenten kan konsumenten bearbeta det som ett radmängdsobjekt. Konsumenten kan erhålla typinformationen för varje kolumn (typ, maximal längd, precision och skala) genom att använda IColumnsInfo::GetColumnInfo eller IColumnsRowset::GetColumnsRowset-gränssnittsmetoden. Konsumenten skapar sedan en accessor för att specificera bindningarna för datan. Nästa steg är att infoga datarader i tabellvärda parameterraduppsättningen. Detta kan göras genom att använda IRowsetChange::InsertRow. IRowsetChange::SetData eller IRowsetChange::D eleteRows kan också användas på tabellvärda parameter-radsetobjektet om du måste manipulera datan. Tabellvärda parameterraduppsättningsobjekt räknas som referens, likt strömobjekt.

Om IColumnsRowset::GetColumnsRowset används kommer det att finnas efterföljande anrop till IRowset::GetNextRows, IRowset::GetData och IRowset::ReleaseRows-metoderna på radsetsobjektet i den resulterande kolumnen.

Efter att OLE DB-drivrutinen för SQL Server börjar köra kommandot, hämtas tabellvärden från detta tabellvärda parameterraduppsättningsobjekt och skickas till servern.

Push-modellen kräver minimalt arbete från konsumenten, men använder mer minne än pull-modellen, eftersom all tabellvärd parameterdata måste finnas i minnet vid exekveringstillfället.

Pull-modell (Erhålla Table-Valued parameterdata på begäran från konsumenten)

Pull-modellen är användbar för två scenarier:

  • Att streama rader.

  • Om en radmängd från en annan leverantör används som tabellvärd parametervärde.

I pull-modellen tillhandahåller konsumenten data på begäran till leverantören. Använd denna metod om din applikation har många datainsättningar, och tabellvärda parameterraduppsättningsdata i minnet skulle resultera i överdriven minnesåtkomst. Om flera OLE DB-leverantörer används möjliggör konsumentens pull-modell att konsumenten kan tillhandahålla vilket radsetsobjekt som helst som tabellvärd parametervärde.

För att använda pull-modellen måste konsumenter tillhandahålla sin egen implementation av ett radsetobjekt. När pullmodellen används med tabellvärda parameterradmängder (CLSID_ROWSET_TVP) krävs det att konsumenten aggregerar det tabellvärda parameterraduppsättningsobjektet som leverantören exponerar via metoden ITableDefinitionWithConstraints::CreateTableWithConstraints eller metoden IOpenRowset::OpenRowset. Konsumentobjektet förväntas endast åsidosätta IRowset-gränssnittets implementation. Du måste åsidosätta följande funktioner:

  • IRowset::GetNextRows

  • IRowset::AddRefRows

  • IRowset::GetData

  • IRowset::ReleaseRows

  • IRowset::OmstartPosition

OLE DB-drivrutinen för SQL Server läser en eller flera rader åt gången från konsumentens raduppsättningsobjekt för att stödja strömningsbeteende i tabellvärda parametrar. Till exempel kan användaren ha tabellvärda parametern raduppsättningsdata på disken (inte i minnet) och implementera funktionaliteten att läsa data från disken när det krävs av OLE DB-drivrutinen för SQL Server.

Konsumenten kommunicerar sitt dataformat till OLE DB-drivrutinen för SQL Server genom att använda IAccessor::CreateAccessor på tabellvärda parametern rowset-objektet. När data från konsumentbufferten läses kontrollerar leverantören att alla skrivbara och icke-standardkolumner är tillgängliga via minst en accessorhand, och använder motsvarande handtag för att läsa kolumndata. För att undvika tvetydighet bör det finnas en en-till-en-korrespondens mellan en tabellvärd parameterraduppsättningskolumn och en bindning. Dubbletter av bindningar till samma kolumn kommer att resultera i ett fel. Dessutom förväntas varje accessor ha iOrdinal-leden av DBBindings i sekvens. Det kommer att finnas lika många anrop till IRowset::GetData som antalet accessorer per rad, och ordningen på anropen kommer att baseras på ordningen av iOrdinal-värdet från lägre till högre värden.

Leverantören förväntas implementera de flesta av gränssnitten som exponeras av tabellvärda parametern rowset-objektet. Konsumenten implementerar ett radsetobjekt med minimala gränssnitt (IRowset). På grund av blind aggregering kommer de återstående obligatoriska radsetsobjektgränssnitten att implementeras av tabellvärda parametern rowset-objektet.

För alla andra raduppsättningsobjekt, såsom raduppsättningsobjekt som erhålls för någon OLE DB-leverantör, måste den konsumenttillhandahållna raduppsättningen implementera alla obligatoriska radsetobjektgränssnitt enligt OLE DB-specifikationen.

Vid körningen kommer OLE DB-drivrutinen för SQL Server att anropa tillbaka till radset-objektet för att hämta rader och läsa kolumndata.

Se även

Table-Valued Parametrar (OLE DB)
Använd Table-Valued parametrar (OLE DB)