Sdílet prostřednictvím


Použijte EXPLICIT režim s FOR XML

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Jak je popsáno v článku, Vytváření XML pomocíFOR XML , REŽIM RAW a AUTO neposkytuje velkou kontrolu nad tvarem XML vygenerovaného z výsledku dotazu. Explicitní režim ale poskytuje největší flexibilitu při generování požadovaného XML z výsledku dotazu.

Dotaz explicitního režimu musí být napsán určitým způsobem, aby byly v rámci dotazu explicitně zadány další informace o požadovaném kódu XML, například očekávané vnoření v xml. V závislosti na požadovaném XML může být psaní dotazů v režimu EXPLICIT těžkopádné. Možná zjistíte, že použití režimu PATH s vnořením je jednodušší alternativou k psaní dotazů explicitního režimu.

Vzhledem k tomu, že v explicitním režimu popíšete požadovaný kód XML jako součást dotazu, je nutné zajistit, aby byl vygenerovaný kód XML správně vytvořený a platný.

Zpracování sady řádků v explicitním režimu

Explicitní režim transformuje sadu řádků, která je výsledkem provádění dotazu, do dokumentu XML. Aby explicitní režim vytvořil dokument XML, musí mít sada řádků určitý formát. To vyžaduje, abyste napsali dotaz SELECT, který vytvoří sadu řádků, univerzální tabulku, s konkrétním formátem, aby logika zpracování pak mohl vytvořit požadovaný KÓD XML.

Nejprve musí dotaz vytvořit následující dva sloupce metadat:

  • První sloupec musí obsahovat číslo značky, celočíselnou hodnotu aktuálního prvku a název sloupce musí být Značka. Dotaz musí poskytnout jedinečné číslo značky pro každý prvek, který bude vytvořen ze sady řádků.

  • Druhý sloupec musí obsahovat identifikátor nadřazeného prvku a tento název sloupce musí být Parent. Tímto způsobem značka a nadřazený sloupec poskytují informace o hierarchii.

Tyto hodnoty sloupců metadat spolu s informacemi v názvech sloupců slouží k vytvoření požadovaného XML. Váš dotaz musí zadat názvy sloupců specifickým způsobem. Všimněte si také, že hodnota 0 nebo NULL ve sloupci Parent označuje, že odpovídající prvek nemá nadřazený prvek. Element je přidán do XML jako element nejvyšší úrovně.

Abyste pochopili, jak se univerzální tabulka vygenerovaná dotazem zpracovává do generování výsledku XML, předpokládejme, že jste napsali dotaz, který vytvoří tuto univerzální tabulku:

Ukázková univerzální tabulka.

Poznamenejte si následující informace o této univerzální tabulce:

  • První dva sloupce jsou Tag a Parent a jsou to metasloupce. Tyto hodnoty určují hierarchii.

  • Názvy sloupců se zadají určitým způsobem, jak je popsáno dále v tomto článku.

  • Při generování XML z této univerzální tabulky jsou data v této tabulce rozdělena svisle do skupin sloupců. Seskupení se určuje na základě hodnoty Tag a názvů sloupců. Při vytváření XML logika zpracování vybere jednu skupinu sloupců pro každý řádek a vytvoří prvek. V tomto příkladu platí následující:

    • Pro hodnotu ve sloupci Značka s číslem 1 v prvním řádku se tvoří skupina sloupců, jejichž názvy obsahují stejné číslo značky, Customer!1!cid a Customer!1!name. Tyto sloupce se používají při zpracování řádku a možná jste si všimli, že obrazec vygenerovaného prvku je <Customer id=... name=...>. Formát názvu sloupce je popsán dále v tomto článku.

    • Pro řádky, kde hodnota ve sloupci Tag je 2, tvoří sloupce Order!2!id a Order!2!date skupinu, která se pak používá při sestavování prvků <Order id=... date=... />.

    • Pro řádky s hodnotou 3 ve sloupci Tag tvoří sloupce OrderDetail!3!id!id a OrderDetail!3!pid!idref skupinu. Každý z těchto řádků generuje prvek, <OrderDetail id=... pid=...>, z těchto sloupců.

  • Při generování hierarchie XML se řádky zpracovávají v pořadí. Hierarchie XML je určená tak, jak je znázorněno v následujícím příkladu:

    • První řádek určuje hodnotu Tag hodnota 1 a Parent null. Proto je odpovídající prvek, <Customer> element, přidán jako element nejvyšší úrovně v XML.

      <Customer cid="C1" name="Janine">
      
    • Druhý řádek identifikuje tag hodnotu 2 a Parent hodnotu 1. Proto je prvek <Order> přidán jako podřízený prvek prvku <Customer>.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
      
    • Další dvě řádky identifikují Tag hodnotu 3 a Parent hodnotu 2. Proto jsou tyto dva prvky, <OrderDetail> prvky, přidány jako podřízené položky <Order> elementu.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
      
    • Poslední řádek identifikuje 2 jako číslo tagu a 1 jako číslo nadřazeného tagu. Proto se do nadřazeného elementu <Customer> přidá další podřízený prvek <Order>.

      <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>
      

Shrneme-li, hodnoty v Tag a Parent metasloupce, informace uvedené v názvech sloupců a správné pořadí řádků vytvoří požadovaný XML při použití režimu EXPLICIT.

Řazení řádků obecné tabulky

Při vytváření XML se řádky v univerzální tabulce zpracovávají v pořadí. Aby bylo možné načíst správné podřízené uzly přidružené ke svému rodiči, musí být řádky v sadě řádků seřazeny tak, aby každý nadřazený uzel byl okamžitě následován podřízenými uzly.

Zadání názvů sloupců v univerzální tabulce

Při psaní dotazů explicitního režimu musí být názvy sloupců ve výsledné sadě řádků zadány pomocí tohoto formátu. Poskytují informace o transformaci, včetně názvů prvků a atributů a dalších informací určených direktivou using.

Toto je obecný formát:

ElementName!TagNumber!AttributeName!Directive

Následuje popis částí formátu.

  • ElementName

    Výsledný obecný identifikátor prvku. Pokud je například Customers zadán jako ElementName, vygeneruje se prvek <Customers>.

  • TagNumber

    Jedinečná hodnota značky přiřazená elementu. Tato hodnota, s pomocí dvou sloupců metadat, Tag a Parent, určuje vnoření prvků ve výsledném XML.

  • Název atributu

    Poskytuje název atributu, který se má sestavit v zadaném ElementName. Toto je chování, pokud není zadána direktiva.

    Je-li zadána direktiva a je xml, cdatanebo element, tato hodnota se používá k vytvoření podřízeného prvku ElementNamea hodnota sloupce se k němu přidá.

    Pokud zadáte direktivu, AtributName může být prázdný. Například ElementName! TagNumber!! Směrnice. V tomto případě je hodnota sloupce přímo součástí ElementName.

  • Směrnice

    směrnice je volitelná a můžete ji použít k poskytnutí dalších informací pro výstavbu XML. směrnice má dva účely.

    • Jedním z účelů je kódování hodnot jako ID, IDREF a IDREFS. Můžete zadat ID, IDREFa IDREFS klíčová slova jako direktivy. Tyto pokyny přepisují typy atributů. Díky tomu můžete vytvářet odkazy v rámci dokumentu.

    • Pomocí direktivy můžete také určit, jak mapovat řetězcová data na XML. skrýt, element, elementxsinil, xml, xmltexta cdata klíčová slova lze použít jako direktivu. příkaz skryje uzel. To je užitečné, když načtete hodnoty pouze pro účely řazení, ale nechcete je ve výsledném XML.

    element direktiva generuje obsažený prvek místo atributu. Obsažená data jsou kódována jako entita. Například znak < se změní na <. Pro hodnoty sloupce NULL se nevygeneruje žádný prvek. Pokud chcete, aby byl prvek vygenerován pro nulové hodnoty sloupců, můžete zadat instrukci elementxsinil. Tím se vygeneruje prvek, který má atribut xsi:nil=TRUE.

    xml direktiva je stejná jako element direktiva s tím rozdílem, že se nedochází k kódování entity. Direktivu prvku lze kombinovat s ID, IDREFnebo IDREFS, zatímco xml direktivu nelze použít s žádnou jinou direktivou, kromě skrýt.

    Směrnice cdata obsahuje data tím, že je obalí do sekce CDATA. Obsah není kódovaný entitou. Původní datový typ musí být textový typ, například varchar, nvarchar, textnebo ntext. Tuto direktivu lze použít pouze s skrýt. Při použití této direktivy nesmí být zadán AttributeName.

    Ve většině případů je povolené kombinování direktiv mezi těmito dvěma skupinami, ale jejich kombinování mezi sebou není povoleno.

Pokud direktivy a AtributName nejsou zadané, například Customer!1, předpokládá se element direktiva, například Customer!1!!elementa data sloupce jsou umístěna v elementu ElementName.

Pokud je zadána direktiva xmltext, obsah sloupce je zabalený do jedné značky, která je integrovaná se zbytkem dokumentu. Tato direktiva je užitečná při načítání přetečených, nespotřebovaných dat XML uložených ve sloupci pomocí OPENXML. Další informace naleznete v tématu OPENXML (SQL Server).

Pokud je zadán AtributName, název značky se nahradí zadaným názvem. V opačném případě je atribut připojen k aktuálnímu seznamu atributů ohraničující prvky umístěním obsahu na začátek zahrnutí bez kódování entity. Sloupec s touto direktivou musí být textový typ, například varchar, nvarchar, char, nchar, textnebo ntext. Tuto direktivu lze použít pouze s skrýt. Tento příkaz je užitečný při načítání přetékajících dat uložených ve sloupci. Pokud obsah není ve správném formátu XML, chování není definováno.

Další kroky

Následující příklady ilustrují použití explicitního režimu.

Viz také