Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-databas i Microsoft Fabric
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)