Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-databas i Microsoft Fabric
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)