Sdílet prostřednictvím


Příklad: Zadání direktiv ID a IDREFS

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Atribut elementu lze zadat jako atribut typu ID a atribut IDREFS se pak dá použít k odkaz na něj. To umožňuje propojení uvnitř dokumentů a podobá se relacím primárního a cizího klíče v relačních databázích.

Tento příklad ukazuje, jak lze direktivy ID a IDREFS použít k vytvoření atributů typů ID a IDREFS . Vzhledem k tomu, že ID nemohou být celočíselné hodnoty, hodnoty ID v tomto příkladu se převedou. Jinými slovy, jsou přetypovány. Předpony se používají pro hodnoty ID.

Předpokládejme, že chcete vytvořit XML, jak je znázorněno v následujícím příkladu:

<Customer CustomerID="C1" SalesOrderIDList=" O11 O22 O33..." >
    <SalesOrder SalesOrderID="O11" OrderDate="..." />
    <SalesOrder SalesOrderID="O22" OrderDate="..." />
    <SalesOrder SalesOrderID="O33" OrderDate="..." />
    ...
</Customer>

Atribut SalesOrderIDList elementu <Customer> je vícehodnotový atribut, který odkazuje na SalesOrderID atribut <SalesOrder> prvku. Chcete-li vytvořit toto propojení, SalesOrderID musí být atribut deklarován typu ID a SalesOrderIDList atribut <Customer> prvku musí být deklarován typu IDREFS . Vzhledem k tomu, že zákazník může požádat o několik objednávek, použije se IDREFS typ.

Prvky typu IDREFS mají také více než jednu hodnotu. Proto musíte použít samostatnou klauzuli select, která opětovně použije stejný tag, nadřazený prvek a informace o klíčovém sloupci. ORDER BY pak musí zajistit, že posloupnost řádků, které tvoří hodnoty IDREFS, se objeví seskupená pod svým nadřazeným prvkem.

Jedná se o dotaz, který vytvoří požadovaný kód XML. Dotaz používá ID a IDREFS direktivy k přepsání typů v názvech sloupců (SalesOrder!2!SalesOrderID!ID, Customer!1!SalesOrderIDList!IDREFS).

USE AdventureWorks2022;
GO
SELECT  1 as Tag,
        0 as Parent,
        C.CustomerID   [Customer!1!CustomerID],
        NULL           [Customer!1!SalesOrderIDList!IDREFS],
        NULL           [SalesOrder!2!SalesOrderID!ID],
        NULL           [SalesOrder!2!OrderDate]
FROM   Sales.Customer C

UNION ALL
SELECT  1 as Tag,
        0 as Parent,
        C.CustomerID,
        'O-'+CAST(SalesOrderID as varchar(10)),
        NULL,
        NULL
FROM   Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
    ON  C.CustomerID = SOH.CustomerID

UNION ALL
SELECT 2 as Tag,
       1 as Parent,
        C.CustomerID,
        NULL,
        'O-'+CAST(SalesOrderID as varchar(10)),
        OrderDate
FROM   Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
    ON  C.CustomerID = SOH.CustomerID
ORDER BY [Customer!1!CustomerID] ,
         [SalesOrder!2!SalesOrderID!ID],
         [Customer!1!SalesOrderIDList!IDREFS]
FOR XML EXPLICIT;

Viz také