Delen via


EXPLICIETe modus gebruiken met FOR XML

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Zoals beschreven in het artikel, Constructing XML Using FOR XML, bieden RAW en AUTO mode niet veel controle over de vorm van de XML die is gegenereerd op basis van een queryresultaat. De EXPLICIETe modus biedt echter de meeste flexibiliteit bij het genereren van de GEWENSTE XML op basis van een queryresultaat.

De query in de EXPLICIETE modus moet op een specifieke manier worden geschreven, zodat aanvullende informatie over de vereiste XML, zoals de verwachte hiërarchie in de XML, expliciet wordt aangegeven als onderdeel van de query. Afhankelijk van de XML die u aanvraagt, kan het schrijven van QUERY's in de EXPLICIETe modus lastig zijn. Het is mogelijk dat het gebruik van de PATH-modus met geneste structuren een eenvoudiger alternatief is voor het schrijven van EXPLICIET-modusquery's.

Omdat u de gewenste XML beschrijft als onderdeel van de query in de modus EXPLICIET, moet u ervoor zorgen dat de gegenereerde XML goed is opgemaakt en geldig is.

Verwerking van rowsets in expliciete modus

De MODUS EXPLICIET transformeert de rijenset die het resultaat is van de queryuitvoering in een XML-document. Als u de EXPLICIETe modus wilt gebruiken om het XML-document te produceren, moet de rijenset een specifieke indeling hebben. Hiervoor moet u de SELECT-query schrijven om de rijenset, de universele tabel, met een specifieke indeling te produceren, zodat de verwerkingslogica vervolgens de gewenste XML kan produceren.

Eerst moet de query de volgende twee metagegevenskolommen produceren:

  • De eerste kolom moet het tagnummer, het type geheel getal, van het huidige element opgeven en de kolomnaam moet Tag zijn. Uw query moet een uniek tagnummer opgeven voor elk element dat wordt samengesteld uit de rijenset.

  • De tweede kolom moet een tagnummer van het bovenliggende element opgeven en deze kolomnaam moet Parent zijn. Op deze manier bieden de kolom Tag en bovenliggende kolom hiërarchiegegevens.

Deze kolomwaarden voor metagegevens worden samen met de informatie in de kolomnamen gebruikt om de gewenste XML te produceren. Uw query moet kolomnamen op een specifieke manier opgeven. Houd er ook rekening mee dat een 0 of NULL in de Parent kolom aangeeft dat het bijbehorende element geen bovenliggend element heeft. Het element wordt als een element op het hoogste niveau aan de XML toegevoegd.

Als u wilt weten hoe de universele tabel die door een query wordt gegenereerd, wordt verwerkt in het genereren van XML-resultaten, gaat u ervan uit dat u een query hebt geschreven die deze universele tabel produceert:

Voorbeeld van universele tabel.

Let op het volgende over deze universele tabel:

  • De eerste twee kolommen zijn Tag en Parent en zijn metakolommen. Deze waarden bepalen de hiërarchie.

  • De kolomnamen worden op een bepaalde manier opgegeven, zoals verderop in dit artikel wordt beschreven.

  • Bij het genereren van de XML uit deze universele tabel worden de gegevens in deze tabel verticaal gepartitioneerd in kolomgroepen. De groepering wordt bepaald op basis van de tagwaarde en de kolomnamen. Bij het maken van XML selecteert de verwerkingslogica één groep kolommen voor elke rij en maakt een element. Het volgende is van toepassing in dit voorbeeld:

    • Voor tagkolomwaarde 1 in de eerste rij vormen de kolommen waarvan de namen hetzelfde tagnummer bevatten, Customer!1!cid en Customer!1!name, een groep. Deze kolommen worden gebruikt bij het verwerken van de rij en u hebt misschien gemerkt dat de vorm van het gegenereerde element is <Customer id=... name=...>. De indeling van de kolomnaam wordt verderop in dit artikel beschreven.

    • Voor rijen met tagkolomwaarde 2 vormen kolommen Order!2!id en Order!2!datum een groep die vervolgens wordt gebruikt bij het maken van elementen. <Order id=... date=... />

    • Voor rijen met Tag kolomwaarde 3 vormen kolommen OrderDetail!3!id!id en OrderDetail!3!pid!idref een groep. Elk van deze rijen genereert een element uit <OrderDetail id=... pid=...>deze kolommen.

  • Bij het genereren van een XML-hiërarchie worden de rijen op volgorde verwerkt. De XML-hiërarchie wordt bepaald zoals wordt weergegeven in het volgende:

    • De eerste rij specificeert tagwaarde 1 en ouder waarde NULL. Daarom wordt het bijbehorende element, <Customer> element, toegevoegd als een element op het hoogste niveau in de XML.

      <Customer cid="C1" name="Janine">
      
    • De tweede rij identificeert Tag waarde 2 en Parent de bovenliggende waarde 1. Daarom wordt het element <Order> toegevoegd als een onderliggend element van het <Customer> element.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
      
    • De volgende twee rijen identificeren tagwaarde 3 en ouder waarde 2. Daarom worden de twee elementen, <OrderDetail> elementen, toegevoegd als onderliggende elementen van het <Order> element.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
      
    • De laatste rij identificeert 2 als het tagnummer en 1 als het bovenliggende tagnummer. Daarom wordt een <Order> subelement toegevoegd aan het <Customer> hoofdelement.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
         </Order>
         <Order id="O2" date="3/29/1997">
      </Customer>
      

Om samen te vatten, produceren de waarden in de meta kolommen Tag en Parent, de informatie in de kolomnamen en de juiste volgorde van de rijen de gewenste XML wanneer u de EXPLICIT modus gebruikt.

Universele tabelrij-volgorde

Bij het maken van de XML worden de rijen in de universele tabel op volgorde verwerkt. Om de juiste onderliggende exemplaren op te halen die aan hun bovenliggende item zijn gekoppeld, moeten de rijen in de dataset zo worden gerangschikt dat elk ouderknooppunt onmiddellijk wordt gevolgd door zijn onderliggende items.

Kolomnamen opgeven in een universele tabel

Wanneer u EXPLICIETe modusquery's schrijft, moeten kolomnamen in de resulterende rijenset worden opgegeven met behulp van deze indeling. Ze bieden transformatie-informatie, waaronder element- en kenmerknamen en andere aanvullende informatie, die is opgegeven met behulp van instructies.

Dit is de algemene indeling:

ElementName!TagNumber!AttributeName!Directive

Hieronder volgt de beschrijving van de onderdelen van de indeling.

  • ElementName-

    De resulterende algemene id van het element. Als klanten bijvoorbeeld is opgegeven als ElementName, wordt het <Customers> element gegenereerd.

  • TagNumber

    Een unieke tagwaarde die is toegewezen aan een element. Deze waarde bepaalt met behulp van de twee metagegevenskolommen Tag en Parent het nesten van de elementen in de resulterende XML.

  • AttributeName

    Geeft de naam van het kenmerk dat moet worden samengesteld in de opgegeven ElementName. Dit is het gedrag als richtlijn niet is opgegeven.

    Als richtlijn is opgegeven en xml, cdata of element is, wordt deze waarde gebruikt om een onderliggend element van ElementName samen te stellen en wordt de kolomwaarde eraan toegevoegd.

    Als u de richtlijn opgeeft, kan de AttributeName leeg zijn. Bijvoorbeeld ElementName! TagNumber!! Richtlijn. In dit geval wordt de kolomwaarde rechtstreeks opgenomen door de ElementName.

  • Richtlijn

    Richtlijn is optioneel en u kunt deze gebruiken om aanvullende informatie te verstrekken voor de constructie van de XML. De richtlijn heeft twee doeleinden.

    • Een van de doeleinden is het coderen van waarden als ID, IDREF en IDREFS. U kunt de trefwoorden ID, IDREF en IDREFS opgeven als instructies. Deze instructies overschrijven de kenmerktypen. Hiermee kunt u koppelingen tussen documenten maken.

    • U kunt ook de richtlijn gebruiken om aan te geven hoe de tekenreeksgegevens aan XML moeten worden toegewezen. De trefwoorden hide, element, elementxsinil, xml, xmltext en cdata kunnen als richtlijn worden gebruikt. De verbergrichtlijn verbergt het knooppunt. Dit is handig wanneer u alleen waarden ophaalt voor sorteerdoeleinden, maar u deze niet in de resulterende XML wilt opnemen.

    De elementrichtlijn genereert een ingesloten element in plaats van een kenmerk. De ingesloten gegevens worden gecodeerd als een entiteit. Het teken < wordt bijvoorbeeld <. Voor NULL-kolomwaarden wordt geen element gegenereerd. Als u een element wilt genereren voor null-kolomwaarden, kunt u de elementxsinil-instructie opgeven. Hiermee wordt een element gegenereerd dat het kenmerk xsi:nil=TRUE heeft.

    De XML-instructie is hetzelfde als een elementrichtlijn , behalve dat er geen entiteitscodering plaatsvindt. De elementrichtlijn kan worden gecombineerd met ID, IDREF of IDREFS, terwijl de XML-instructie niet is toegestaan met een andere richtlijn, behalve verbergen.

    De cdata-instructie bevat de gegevens door deze te verpakken met een CDATA-sectie. De inhoud is niet gecodeerd door een entiteit. Het oorspronkelijke gegevenstype moet een teksttype zijn, zoals varchar, nvarchar, tekst of ntext. Deze richtlijn kan alleen met verbergen worden gebruikt. Wanneer deze instructie wordt gebruikt, mag AttributeName niet worden opgegeven.

    Het combineren van instructies tussen deze twee groepen is in de meeste gevallen toegestaan, maar het combineren ervan is niet toegestaan.

Als Richtlijn en AttributeName niet zijn opgegeven, bijvoorbeeld Customer!1, wordt er een elementrichtlijn geïmpliceerd, zoals Customer!1!! element- en kolomgegevens bevinden zich in de ElementName.

Als de XML-tekstrichtlijn is opgegeven, wordt de kolominhoud verpakt in één tag die is geïntegreerd met de rest van het document. Deze instructie is handig bij het ophalen van overloop-, niet-verwerkte XML-gegevens die zijn opgeslagen in een kolom door OPENXML. Zie OPENXML (SQL Server) voor meer informatie.

Als AttributeName is opgegeven, wordt de tagnaam vervangen door de opgegeven naam. Anders wordt het kenmerk toegevoegd aan de huidige lijst met kenmerken van de omsluitelementen door de inhoud aan het begin van de insluiting te plaatsen zonder entiteitscodering. De kolom met deze richtlijn moet een teksttype zijn, zoals varchar, nvarchar, char, nchar, tekst of ntext. Deze richtlijn kan alleen met verbergen worden gebruikt. Deze richtlijn is handig bij het ophalen van overloopgegevens die zijn opgeslagen in een kolom. Als de inhoud geen goed opgemaakte XML is, is het gedrag niet gedefinieerd.

Volgende stappen

In de volgende voorbeelden ziet u het gebruik van de EXPLICIETe modus.

Zie ook