Exemplaren van XML-gegevens maken
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
In dit artikel wordt beschreven hoe u XML-exemplaren genereert.
In SQL Server kunt u XML-exemplaren op de volgende manieren genereren:
- Typ cast-tekenreeksexemplaren.
- Gebruik de
SELECT
-instructie met deFOR XML
-clausule. - Constante toewijzingen gebruiken.
- Bulksgewijs laden gebruiken.
Type cast-tekenreeks en binaire exemplaren
U kunt elk van de gegevenstypen van de SQL Server-tekenreeks parseren. zoals [n]varchar, [n]char, [n]text, varbinaryen afbeelding, in het xml- gegevenstype door teCONVERT
casten (CAST
) of de tekenreeks te converteren naar het xml- gegevenstype. Niet-getypte XML wordt gecontroleerd om te bevestigen dat deze goed is opgemaakt. Als er een schema is gekoppeld aan het xml- type, wordt ook validatie uitgevoerd. Voor meer informatie, zie Vergelijk type XML met niet-getype XML.
XML-documenten kunnen worden gecodeerd met verschillende coderingen (bijvoorbeeld UTF-8, UTF-16, Windows-1252). Hieronder vindt u een overzicht van de regels voor de interactie van de tekenreeks en binaire brontypen met de codering van xml-documenten en hoe de parser zich gedraagt.
Aangezien nvarchar- ervan uitgaat dat een Unicode-codering van 2 bytes, zoals UTF-16 of UCS-2, wordt gebruikt, behandelt de XML-parser de tekenreekswaarde als een XML-document of -fragment met 2 bytes Unicode-codering. Het XML-document moet worden gecodeerd in een Unicode-codering van 2 byte en moet compatibel zijn met het brongegevenstype. Een UTF-16 gecodeerd XML-document kan een UTF-16 byte ordermarkering (BOM) hebben, maar dit hoeft niet, omdat in de context van het brontype duidelijk wordt dat het alleen een 2-byte Unicode-gecodeerd document kan zijn.
De inhoud van een varchar tekenreeks wordt behandeld als een xml-document/fragment met 1 byte dat is gecodeerd door de XML-parser. Omdat de varchar brontekenreeks een codepagina heeft gekoppeld, gebruikt de parser die codepagina voor de codering als er geen expliciete codering is opgegeven in de XML zelf. Als een XML-exemplaar een Byte Order Mark of een coderingsverklaring heeft, moet de Byte Order Mark of verklaring consistent zijn met de codepagina, anders meldt de parser een fout.
De inhoud van varbinaire wordt behandeld als een codepuntstroom die rechtstreeks wordt doorgegeven aan de XML-parser. Het XML-document of -fragment moet dus de stuklijst of andere coderingsinformatie inline leveren. De parser kijkt alleen naar de stream om de codering te bepalen. Dit betekent dat UTF-16-gecodeerde XML de UTF-16 BOM moet bevatten, en dat een instantie zonder BOM en zonder een coderingsverklaring wordt geïnterpreteerd als UTF-8.
Als de codering van het XML-document niet van tevoren bekend is en de gegevens worden doorgegeven als tekenreeks of binaire gegevens in plaats van XML-gegevens voordat ze naar XML worden gecast, moet u de gegevens behandelen als varbinaire. Als u bijvoorbeeld gegevens uit een XML-bestand leest met behulp van OpenRowset()
, moet u de gegevens opgeven die moeten worden gelezen als een varbinary(max) waarde:
SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);
SQL Server vertegenwoordigt intern XML in een efficiënte binaire weergave die gebruikmaakt van UTF-16-codering. Door de gebruiker geleverde codering blijft niet behouden, maar wordt tijdens het parseringsproces overwogen.
Type cast CLR door de gebruiker gedefinieerde typen
Als een door de gebruiker gedefinieerde CLR-type een XML-serialisatie heeft, kunnen exemplaren van dat type expliciet worden geconverteerd naar een XML-gegevenstype. Zie XML-serialisatie van CLR-databaseobjectenvoor meer informatie over de XML-serialisatie van een door de gebruiker gedefinieerd type CLR.
Witruimte verwerken in getypte XML
In SQL Server wordt witruimte in elementinhoud genegeerd als deze zich in een reeks alleen-witruimtegegevens bevindt die zijn gescheiden door markeringen, zoals begin- of eindtags, en niet zijn getitiseerd. (CDATA
secties worden genegeerd.) Deze verwerking van witruimteverwerking verschilt van de manier waarop witruimte wordt beschreven in de XML 1.0-specificatie die is gepubliceerd door het World Wide Web Consortium (W3C). Dit komt doordat de XML-parser in SQL Server slechts een beperkt aantal DTD-subsets herkent, zoals gedefinieerd in XML 1.0. Zie CAST en CONVERTvoor meer informatie over de beperkte DTD-subsets die worden ondersteund in SQL Server.
De XML-parser verwijdert standaard onbelangrijke witruimte wanneer tekenreeksgegevens worden geconverteerd naar XML als een van de volgende opties waar is:
Het kenmerk
xml:space
is niet gedefinieerd voor een element of de bovenliggende elementen.Het kenmerk
xml:space
dat van kracht is op een element, of op een van zijn voorouderlijke elementen, heeft de waarde standaard.
Bijvoorbeeld:
DECLARE @x XML;
SET @x = '<root> <child/> </root>';
SELECT @x;
Dit is de resultaatset.
<root><child/></root>
U kunt dit gedrag echter wijzigen. Als u witruimte voor een XML DT-exemplaar wilt behouden, gebruikt u de operator CONVERT
en de optionele stijl parameter ingesteld op een waarde van 1. Bijvoorbeeld:
SELECT CONVERT(XML, N'<root> <child/> </root>', 1);
Als de stijl parameter niet wordt gebruikt, of als de waarde ervan is ingesteld op 0
, blijft er geen onbelangrijke witruimte behouden voor de conversie van het XML DT-exemplaar. Zie voor meer informatie over het gebruik van de operator CONVERT
en de bijbehorende stijl parameter bij het converteren van tekenreeksgegevens naar XML DT-exemplaren CAST en CONVERTEREN.
Voorbeeld: Een tekenreekswaarde casten naar getypte XML en deze toewijzen aan een kolom
In het volgende voorbeeld wordt een tekenreeksvariabele met een XML-fragment geconverteerd naar het xml- gegevenstype en wordt deze vervolgens opgeslagen in de kolom xml- type:
CREATE TABLE T (
c1 INT PRIMARY KEY,
c2 XML
);
GO
DECLARE @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
De volgende invoegbewerking converteert impliciet van een tekenreeks naar het xml- type:
INSERT INTO T
VALUES (3, @s);
U kunt de tekenreeks expliciet omzetten naar het xml- type CAST
.
INSERT INTO T
VALUES (3, CAST(@s AS XML));
U kunt ook CONVERT
gebruiken, zoals wordt weergegeven in het volgende codevoorbeeld:
INSERT INTO T
VALUES (3, CONVERT(XML, @s));
Voorbeeld: Een tekenreeks converteren naar getypte XML en deze toewijzen aan een variabele
In het volgende voorbeeld wordt een tekenreeks geconverteerd naar xml--type en toegewezen aan een variabele van het xml- gegevenstype:
DECLARE @x XML;
DECLARE @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);
SELECT @x;
Gebruik de SELECT-instructie met een FOR XML-clausule
U kunt de FOR XML
component in een SELECT
instructie gebruiken om resultaten als XML te retourneren. Bijvoorbeeld:
DECLARE @xmlDoc XML;
SET @xmlDoc = (
SELECT Column1, Column2
FROM Table1, Table2
WHERE <some_condition>
FOR XML AUTO
)
...;
De instructie SELECT
retourneert een tekstueel XML-fragment dat vervolgens wordt geparseerd tijdens de toewijzing aan de xml- gegevenstypevariabele.
U kunt ook de instructie TYPE gebruiken in FOR XML-query's in de FOR XML
component die rechtstreeks een FOR XML
queryresultaat retourneert als xml- type:
DECLARE @xmlDoc XML;
SET @xmlDoc = (
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID = 19
FOR XML AUTO, TYPE
);
SELECT @xmlDoc;
Dit is de resultaatset.
<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...
In het volgende voorbeeld wordt het getypte xml- resultaat van een FOR XML
query ingevoegd in een xml- typekolom:
CREATE TABLE T1 (
c1 INT,
c2 XML
);
GO
INSERT T1 (c1, c2)
SELECT 1, (
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID = 19
FOR XML AUTO, TYPE
);
SELECT *
FROM T1;
GO
Zie FOR XML (SQL Server)voor meer informatie over FOR XML
.
Notitie
SQL Server retourneert xml- gegevenstypeexemplaren naar de client als gevolg van verschillende serverconstructies, zoals FOR XML
query's die gebruikmaken van de TYPE
instructie, of waarbij het xml- gegevenstype wordt gebruikt om XML te retourneren uit kolommen, variabelen en uitvoerparameters van SQL Server Database Engine. In de code van de clienttoepassing vraagt de ADO.NET provider aan dat deze xml- gegevenstypegegevens worden verzonden in een binaire codering van de server. Als u echter FOR XML
gebruikt zonder de TYPE
instructie, worden de XML-gegevens geretourneerd als een tekenreekstype. In elk geval kan de clientprovider altijd een van beide vormen van XML verwerken.
Constante toewijzingen gebruiken
Een tekenreeksconstante kan worden gebruikt wanneer een exemplaar van het xml- gegevenstype wordt verwacht. Deze toewijzing is hetzelfde als een impliciete CAST
van tekenreeks naar XML. Bijvoorbeeld:
DECLARE @xmlDoc XML;
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';
In het vorige voorbeeld wordt de tekenreeks impliciet geconverteerd naar het xml- gegevenstype en wordt deze toegewezen aan een XML--typevariabele.
In het volgende voorbeeld wordt een constante tekenreeks ingevoegd in een xml- typekolom:
CREATE TABLE T (
c1 INT PRIMARY KEY,
c2 XML
);
INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');
Notitie
Voor getypte XML wordt de XML gevalideerd op basis van het opgegeven schema. Zie voor meer informatie over het vergelijken van getypte XML met niet-getypte XML.
Bulksgewijs laden gebruiken
Met de verbeterde functionaliteit OPENROWSET kunt u XML-documenten bulksgewijs laden in de database. U kunt XML-exemplaren in bulk vanuit bestanden laden in de XML- type kolommen in de database. Zie Voorbeelden van bulksgewijs importeren en exporteren van XML-documenten (SQL Server)voor werkvoorbeelden. Zie XML-gegevens ladenvoor meer informatie over het laden van XML-documenten.
In deze sectie
Artikel | Beschrijving |
---|---|
XML-queryopties en bewaarde gegevens | Beschrijft de onderdelen van XML-exemplaren die niet behouden blijven wanneer ze worden opgeslagen in databases. |