Exempel: Ange ID- och IDREFS-direktiven

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Ett elementattribut kan anges som ett ID-typattribut och IDREFS-attributet kan sedan användas för att referera till det. Detta möjliggör länkar mellan dokument och liknar primärnyckeln och sekundärnyckelrelationer i relationsdatabaser.

Det här exemplet illustrerar hur ID - och IDREFS-direktiven kan användas för att skapa attribut av ID - och IDREFS-typer . Eftersom ID:t inte kan vara heltalsvärden konverteras ID-värdena i det här exemplet. Med andra ord är de typ gjutna. Prefixer används för ID-värdena.

Anta att du vill skapa XML enligt följande:

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

Attributet SalesOrderIDList för elementet <Customer> är ett flervärdesattribut som refererar till SalesOrderID elementets <SalesOrder> attribut. För att upprätta den här SalesOrderID länken måste attributet deklareras av ID typ, och SalesOrderIDList attributet för <Customer> elementet måste deklareras av IDREFS typ. Eftersom en kund kan begära flera beställningar IDREFS används typen.

Element av IDREFS-typ har också mer än ett värde. Därför måste du använda en separat SELECT-sats som återanvänder samma tagg-, föräldra- och nyckelkolumnsinformation. ORDER BY måste sedan säkerställa att sekvensen med rader som utgör IDREFS-värdena visas grupperade tillsammans under deras överordnade element.

Det här är frågan som genererar den XML du vill ha. Frågan använder direktiven ID och IDREFS för att skriva över typerna i kolumnnamnen (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;

Se även