Dela via


Använda XML-datatyper

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

Ladda ned OLE DB-drivrutins

SQL Server 2005 (9.x) introducerade en xml-datatyp som gör det möjligt att lagra XML-dokument och fragment i en SQL Server-databas. XML-datatypen är en inbyggd datatyp i SQL Server och liknar på sätt och vis andra inbyggda typer, till exempel int och varchar. Precis som med andra inbyggda typer kan du använda xml-datatypen som kolumntyp när du skapar en tabell; som variabeltyp, parametertyp eller funktionsåterkaststyp; eller i CAST- och CONVERT-funktionerna.

Programmeringsöverväganden

XML kan vara självbeskrivande i det att det valfritt kan inkludera en XML-header som specificerar dokumentets kodning, till exempel:

<?xml version="1.0" encoding="windows-1252"?><doc/>

XML-standarden beskriver hur en XML-processor kan upptäcka kodningen som används för ett dokument genom att undersöka de första bytena av dokumentet. Det finns möjligheter för att kodningen som angivits av applikationen kan krocka med kodningen som anges i dokumentet. För dokument som skickas som bundna parametrar behandlas XML som binär data av SQL Server, så inga konverteringar görs och XML-parsern kan använda den kodning som anges i dokumentet utan problem. För XML-data som är bunden som WSTR måste applikationen dock säkerställa att dokumentet är kodat som Unicode. Detta scenario kan innebära att dokumentet laddas in i en DOM, kodningen ändras till Unicode och dokumentet serialiseras. Om detta steg inte utförs kan datakonverteringar ske, vilket resulterar i ogiltig eller korrupt XML.

Det finns också risk för konflikt när XML specificeras i literaler. Till exempel är följande ogiltiga:

INSERT INTO xmltable(xmlcol) VALUES('<?xml version="1.0" encoding="UTF-16"?><doc/>')

INSERT INTO xmltable(xmlcol) VALUES(N'<?xml version="1.0" encoding="UTF-8"?><doc/>')

OLE DB-drivrutin för SQL Server

DBTYPE_XML är en ny datatyp specifik för XML i OLE DB-drivrutinen för SQL Server. Dessutom kan XML-data nås via befintliga OLE DB-typer av DBTYPE_BYTES, DBTYPE_WSTR, DBTYPE_BSTR, DBTYPE_XML, DBTYPE_STR, DBTYPE_VARIANT och DBTYPE_IUNKNOWN. Data som lagras i kolumner av typen XML kan hämtas från en kolumn i en OLE DB-drivrutin för SQL Server-raduppsättning i följande format:

  • En textsträng

  • En ISequentiell ström

Anmärkning

OLE DB-drivrutinen för SQL Server inkluderar inte en SAX-läsare, men ISequentialStream kan enkelt skickas till SAX- och DOM-objekt i MSXML.

ISequentialStream bör användas för hämtning av stora XML-dokument. Samma tekniker som används för andra stora värdetyper gäller även för XML. För mer information, se Användning av stora värdetyper.

Data som lagras i kolumner av typen XML i en radmängd kan också hämtas, infogas eller uppdateras av en applikation via vanliga gränssnitt såsom IRow::GetColumns, IRowChange::SetColumns och ICommand::Execute. På liknande sätt som i hämtningsfallet kan ett applikationsprogram skicka antingen en textsträng eller en ISequentialStream till OLE DB-drivrutinen för SQL Server.

Anmärkning

För att skicka XML-data i strängformat genom ISequentialStream-gränssnittet måste du få ISequentialStream genom att specificera DBTYPE_IUNKNOWN och sätta dess pObject-argument till null i bindningen.

När hämtad XML-data förkortas på grund av att konsumentbufferten är för liten kan längden returneras som 0xffffffff, vilket innebär att längden är okänd. Detta beteende är förenligt med dess implementation som en datatyp som strömmas till klienten utan att skicka längdinformation före den faktiska datan. I vissa fall kan den faktiska längden returneras när leverantören har buffrat hela värdet, såsom IRowset::GetData och där datakonvertering utförs.

XML-data som skickas till SQL Server behandlas som binär data av servern. Detta beteende förhindrar att konverteringar sker och tillåter XML-parsern att automatiskt upptäcka XML-kodningen. Detta möjliggör att ett bredare utbud av XML-dokument (till exempel de som kodas i UTF-8) kan accepteras som indata till SQL Server.

Om indata XML är bunden som DBTYPE_WSTR måste applikationen säkerställa att den redan är Unicode-kodad för att undvika risk för korruption från oönskade datakonverteringar.

Databindningar och tvång

Följande tabell beskriver bindningen och tvånget som uppstår när de listade datatyperna används med SQL Server-xml-datatypen .

Datatyp Till servern

XML
Till servern

Icke-XML
Från servern

XML
Från servern

Icke-XML
DBTYPE_XML Passera6,7 Fel1 OK11, 6 Fel8
DBTYPE_BYTES Passera6,7 Ej tillämpligt2 OK 11, 6 Ej tillgängligt 2
DBTYPE_WSTR Passera6,10 Ej tillgängligt 2 OK4, 6, 12 Ej tillgängligt 2
DBTYPE_BSTR Passera6,10 Ej tillgängligt 2 OK 3 Ej tillgängligt 2
DBTYPE_STR Okej6, 9, 10 Ej tillgängligt 2 OK5, 6, 12 Ej tillgängligt 2
DBTYPE_IUNKNOWN Byteström via ISequentialStream7 Ej tillgängligt 2 Byteström via ISequentialStream11 Ej tillgängligt 2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Passera6,7 Ej tillgängligt 2 N/A Ej tillgängligt 2
DBTYPE_VARIANT (VT_BSTR) Passera6,10 Ej tillgängligt 2 OK3 Ej tillgängligt 2

1Om en servertyp annan än DBTYPE_XML anges med ICommandWithParameters::SetParameterInfo och accessortypen är DBTYPE_XML, uppstår ett fel när satsen exekveras (DB_E_ERRORSOCCURRED är parameterstatusen DBSTATUS_E_BADACCESSOR); annars skickas datan till servern, men servern returnerar ett felmeddelande som indikerar att det inte sker någon implicit konvertering från XML till parameterns datatyp.

2Utöver ramen för denna artikel.

3Formatet är UTF-16, ingen by-order mark (BOM), ingen kodningsspecifikation, ingen null-terminering.

4Formatet är UTF-16, ingen styckliste, ingen kodningsspecifikation, nullterminering.

5Formatet är multibytetecken kodade i klientkod med null terminator. Konvertering från serverlevererad Unicode kan orsaka datakorruption, så denna bindning avråds.

6BY_REF kan användas.

7UTF-16-data måste börja med en styckliste. Om den inte gör det kan kodningen inte kännas igen korrekt av servern.

8Validering kan ske vid skapande accessor-tid, eller vid hämtningstid. Felet är DB_E_ERRORSOCCURRED, bindningsstatus satt till DBBINDSTATUS_UNSUPPORTEDCONVERSION.

9Data konverteras till Unicode med klientkodsidan innan den skickas till servern. Om dokumentkodningen inte matchar klientkodsidan kan datakorruption uppstå, så denna bindning avråds starkt.

10En styckliste läggs alltid till data som skickas till servern. Om datan redan startat med en styckliste, kommer det att finnas två stykkaralistor i början av bufferten. Servern använder den första BOM:en för att känna igen kodningen som UTF-16 och kasserar den sedan. Den andra stycklisten tolkas som ett icke-brytande mellanrumstecken med noll bredd.

11Formatet är UTF-16, ingen kodningsspecifikation, en BOM läggs till data som tas emot från servern. Om en tom sträng returneras av servern returneras en BOM ändå till applikationen. Om buffertlängden är udda antal byte avkortas datan korrekt. Om hela värdet returneras i bitar kan de sammanfogas för att återskapa det korrekta värdet.

12Om buffertlängden är färre än två tecken – det vill säga inte tillräckligt med utrymme för nullterminering – rapporteras ett överflödesfel.

Anmärkning

Ingen data returneras för NULL XML-värden.

XML-standarden kräver att UTF-16-kodad XML börjar med byteordningsmärke (BOM), UTF-16-teckenskod 0xFEFF. När man arbetar med WSTR- och BSTR-bindningar kräver eller lägger OLE DB-drivrutinen för SQL Server inte till en styckliste, eftersom kodningen antyds av bindningen. När man arbetar med BYTES-, XML- eller IUNKNOWN bindningar är avsikten att förenkla hanteringen av andra XML-processorer och lagringssystem. I detta fall bör en BOM finnas med UTF-16-kodad XML, och applikationen behöver inte bry sig om själva kodningen, eftersom majoriteten av XML-processorer (inklusive SQL Server) härleder kodningen genom att inspektera de första bytena av värdet. XML-data som tas emot från OLE DB Driver för SQL Server med hjälp av BYTES-, XML- eller IUNKNOWN bindningar kodas alltid i UTF-16 med en stycklista och utan en inbäddad kodningsdeklaration.

Datakonverteringar som tillhandahålls av OLE DB-kärntjänster (IDataConvert) är inte tillämpliga på DBTYPE_XML.

Validering görs när data skickas till servern. Validering och kodningsändringar på klientsidan bör hanteras av din applikation. Det rekommenderas att du inte bearbetar XML-data direkt, utan istället använder en DOM- eller SAX-läsare för att bearbeta den.

DBTYPE_NULL och DBTYPE_EMPTY kan bindas för indataparametrar men inte för utgångsparametrar eller resultat. När den är begränsad för indataparametrar måste statusen sättas till DBSTATUS_S_ISNULL eller DBSTATUS_S_DEFAULT.

DBTYPE_XML kan konverteras till DBTYPE_EMPTY och DBTYPE_NULL, DBTYPE_EMPTY kan konverteras till DBTYPE_XML, men DBTYPE_NULL kan inte konverteras till DBTYPE_XML. Detta stämmer överens med DBTYPE_WSTR.

DBTYPE_IUNKNOWN är en stödd bindning (som visas i föregående tabell), men det finns inga konverteringar mellan DBTYPE_XML och DBTYPE_IUNKNOWN. DBTYPE_IUNKNOWN får inte användas med DBTYPE_BYREF.

OLE DB raduppsättningstillägg och ändringar

OLE DB Driver för SQL Server lägger till nya värden eller ändringar i många av de centrala raderna i OLE DB-schemat.

COLUMNS och PROCEDURE_PARAMETERS schema-radmängder

Tillägg till COLUMNS och PROCEDURE_PARAMETERS schema-raduppsättningar inkluderar följande kolumner:

Kolumnnamn Typ Description
SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Namnet på en katalog där en XML-schemasamling definieras. NULL för en icke-XML-kolumn eller en otypad XML-kolumn.
SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Namnet på ett schema där en XML-schemasamling definieras. NULL för en icke-XML-kolumn eller en otypad XML-kolumn.
SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Namnet på XML-schemasamling. NULL för en icke-XML-kolumn eller en otypad XML-kolumn.

Den PROVIDER_TYPES schema-raduppsättningen

I PROVIDER_TYPES schema-raduppsättningen är COLUMN_SIZE-värdet 0 för xml-datatypen , och DATA_TYPE är DBTYPE_XML.

Den SS_XMLSCHEMA schema-raduppsättningen

En ny schema-raduppsättning SS_XMLSCHEMA introduceras för klienter att hämta XML-schemainformation. SS_XMLSCHEMA raduppsättning innehåller följande kolumner:

Kolumnnamn Typ Description
SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Katalogen som en XML-samling tillhör.
SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Schemat som en XML-samling tillhör.
SCHEMACOLLECTIONNAME DBTYPE_WSTR Namnet på en XML-schemasamling för typade XML-kolumner, annars NULL.
TARGETNAMESPACEURI DBTYPE_WSTR Målnamnsutrymmet för ett XML-schema.
SCHEMAINNEHÅLL DBTYPE_WSTR XML-schemainnehållet.

Varje XML-schema är begränsat efter katalognamn, schemanamn, schemasamlingsnamn och målnamnsutrymme Uniform Resource Identifier (URI). Dessutom definieras en ny GUID med namnet DBSCHEMA_XML_COLLECTIONS. Antalet begränsningar och begränsade kolumner för SS_XMLSCHEMA schema-raduppsättningen definieras enligt följande.

GUID (globalt unikt identifierare) Antal restriktioner Begränsade kolumner
DBSCHEMA_XML_COLLECTIONS 4 SCHEMACOLLECTION_CATALOGNAME

SCHEMACOLLECTION_SCHEMANAME

SCHEMACOLLECTIONNAME

TARGETNAMESPACEURI

OLE DB egenskapsuppsättningstillägg och ändringar

OLE DB Driver för SQL Server lägger till nya värden eller ändringar i många av de grundläggande egenskapsuppsättningarna i OLE DB.

Den DBPROPSET_SQLSERVERPARAMETER egenskapsmängden

För att stödja xml-datatypen via OLE DB implementerar ole db Driver för SQL Server den nya DBPROPSET_SQLSERVERPARAMETER egenskapsuppsättningen, som innehåller följande värden.

Namn Typ Description
SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Namnet på en katalog (databas) där en XML-schemasamling definieras. En del av SQL:s tredelade namnidentifierare.
SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Namnet på ett XML-schema inom schemasamlingen. En del av SQL Three -part name-identifieraren.
SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Namnet på XML-schemasamlingen i katalogen En del av SQL tre -part namnidentifieraren.

Den DBPROPSET_SQLSERVERCOLUMN egenskapsmängden

För att stödja skapandet av tabeller i ITableDefinition-gränssnittet lägger OLE DB Driver för SQL Server till tre nya kolumner i DBPROPSET_SQLSERVERCOLUMN egenskapsuppsättning.

Namn Typ Description
SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME VT_BSTR För typade XML-kolumner är denna egenskap en sträng som specificerar namnet på katalogen där XML-schemat lagras. För andra kolumntyper returnerar denna egenskap en tom sträng.
SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME VT_BSTR För typade XML-kolumner är denna egenskap en sträng som anger namnet på XML-schemat som definierar denna kolumn.
SSPROP_COL_XML_SCHEMACOLLECTIONNAME VT_BSTR För typade XML-kolumner är denna egenskap en sträng som specificerar namnet på schemat XML-schemasamling som definierar värdet.

Precis som SSPROP_PARAM värden är alla dessa egenskaper valfria och som standard tomma. SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME och SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME får endast specificeras om SSPROP_COL_XML_SCHEMACOLLECTIONNAME är specificerat. När XML skickas till servern, om dessa värden inkluderas, kontrolleras de för existens (giltighet) mot den aktuella databasen och instansdata kontrolleras mot schemat. I alla fall är de antingen helt tomma eller ifyllda för att vara galda.

OLE DB-gränssnittets tillägg och förändringar

OLE DB Driver för SQL Server lägger till nya värden eller ändringar i många av de centrala OLE DB-gränssnitten.

ISSCommandWithParameters-gränssnittet

För att stödja xml-datatypen via OLE DB implementerar ole db Driver för SQL Server ett antal förändringar, inklusive tillägget av ISSCommandWithParameters-gränssnittet . Detta nya gränssnitt ärver från kärngränssnittet i OLE DB ICommandWithParameters. Utöver de tre metoder som ärvts från ICommandWithParameters; GetParameterInfo, MapParameterNames och SetParameterInfo; ISSCommandWithParameters tillhandahåller metoderna GetParameterProperties och SetParameterProperties som används för att hantera serverspecifika datatyper.

Anmärkning

ISSCommandWithParameters-gränssnittet använder också den nya SSPARAMPROPS-strukturen.

IColumnsRowset-gränssnittet

OLE DB Driver för SQL Server lägger till följande SQL Server-specifika kolumner till raduppsättningen som returneras av IColumnRowset::GetColumnsRowset-metoden . Dessa kolumner innehåller det tredelade namnet på en XML-schemasamling. För icke-XML-kolumner eller otypade XML-kolumner tar alla tre kolumner standardvärdet NULL.

Kolumnnamn Typ Description
DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Katalogen som en XML-schemasamling tillhör,

NULL annars.
DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Schemat som en XML-schemasamling tillhör. NULL annars.
DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Namnet på XML-schemasamlingen för den typade XML-kolumnen, annars NULL.

IRowset-gränssnittet

En XML-instans i en XML-kolumn hämtas via IRowset::GetData-metoden . Beroende på vilken bindning klienten specificerar kan en XML-instans hämtas som DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML, DBTYPE_STR, DBTYPE_BYTES eller som ett gränssnitt via DBTYPE_IUNKNOWN. Om konsumenten specificerar DBTYPE_BSTR, DBTYPE_WSTR eller DBTYPE_VARIANT, konverterar leverantören XML-instansen till användarbegärd typ och placerar den i den plats som anges i motsvarande bindning.

Om konsumenten specificerar DBTYPE_IUNKNOWN och sätter pObject-argumentet till NULL, eller pObject-argumentet till IID_ISequentialStream, returnerar leverantören ett ISequentialStream-gränssnitt till konsumenten så att konsumenten kan strömma XML-data ut ur kolumnen. ISequentialStream returnerar sedan XML-data som en Unicode-teckenström.

När leverantören returnerar ett XML-värde bundet till DBTYPE_IUNKNOWN rapporterar det ett storleksvärde på sizeof (IUnknown *). Detta beteende är förenligt med tillvägagångssättet när en kolumn är bunden som DBTYPE_IUnknown eller DBTYPE_IDISPATCH, och med DBTYPE_IUNKNOWN/ISequentialStream när den exakta kolumnstorleken inte kan bestämmas.

IRowsetChange-gränssnittet

Det finns två sätt för en konsument att uppdatera en XML-instans i en kolumn. Den första är genom lagringsobjektet ISequentialStream som skapats av leverantören. Konsumenten kan anropa metoden ISequentialStream:::Write för att direkt uppdatera XML-instansen som returneras av leverantören.

Det andra tillvägagångssättet är via IRowsetChange::SetData eller IRowsetChange::InsertRow-metoderna . I detta tillvägagångssätt kan en XML-instans i konsumentens buffert specificeras i en bindning av typen DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML eller DBTYPE_IUNKNOWN.

Om DBTYPE_BSTR, DBTYPE_WSTR eller DBTYPE_VARIANT anges lagrar leverantören XML-instansen som finns i konsumentbufferten i rätt kolumn.

Om DBTYPE_IUNKNOWN/ISequentialStream specificeras, om konsumenten inte specificerar något lagringsobjekt, måste konsumenten skapa ett ISequentialStream-objekt i förväg, binda XML-dokumentet med objektet och sedan skicka objektet till leverantören via IRowsetChange::SetData-metoden . Konsumenten kan också skapa ett lagringsobjekt, sätta pObject-argumentet till IID_ISequentialStream, skapa ett ISequentialStream-objekt och sedan skicka ISequentialStream-objektet till metoden IRowsetChange::SetData . I båda fallen kan leverantören hämta XML-objektet via ISequentialStream-objektet och infoga det i en korrekt kolumn.

IRowsetUpdate-gränssnittet

IRowsetUpdate-gränssnittet erbjuder funktionalitet för fördröjda uppdateringar. Den data som görs tillgänglig för radmängderna görs inte tillgänglig för andra transaktioner förrän konsumenten anropar IRowsetUpdate::Update-metoden .

IRowsetFind-gränssnittet

IRowsetFind::FindNextRow-metoden fungerar inte med xml-datatypen. När IRowsetFind::FindNextRow anropas och argumentet hAccessor specificerar en kolumn med DBTYPE_XML, returneras DB_E_BADBINDINFO. Detta sker oavsett vilken typ av kolumn som söks i. För alla andra bindningstyper misslyckas FindNextRow med DB_E_BADCOMPAREOP om kolumnen som ska sökas är av xml-datatypen.

Se även

OLE DB-drivrutin för SQL Server-funktioner
ISSCommandWithParameters (OLE DB)