Partilhar via


Exemplo: Especificar as diretivas ID e IDREFS

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Um atributo elemento pode ser especificado como um atributo tipo ID , e o atributo IDREFS pode então ser usado para se referir a ele. Isto permite ligações intra-documento e é semelhante às relações entre chave primária e chave estrangeira em bases de dados relacionais.

Este exemplo ilustra como as diretivas ID e IDREFS podem ser usadas para criar atributos dos tipos ID e IDREFS . Como os IDs não podem ser valores inteiros, os valores de ID neste exemplo são convertidos. Ou seja, são tipificados. Prefixos são usados para os valores de ID.

Assuma que pretende construir XML conforme mostrado no seguinte:

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

O SalesOrderIDList atributo do <Customer> elemento é um atributo multivalorado que se refere ao SalesOrderID atributo do elemento <SalesOrder> . Para estabelecer esta ligação, o SalesOrderID atributo deve ser declarado de ID tipo, e o SalesOrderIDList atributo do <Customer> elemento deve ser declarado de IDREFS tipo. Como um cliente pode pedir várias encomendas, utiliza-se o IDREFS tipo.

Elementos do tipo IDREFS também têm mais do que um valor. Por isso, tem de usar uma cláusula select separada que reutilize a mesma tag, elemento pai e informação de coluna chave. Depois, ORDER BY tem de garantir que a sequência de linhas que compõem os valores IDREFS aparece agrupada sob o seu elemento pai.

Esta é a consulta que produz o XML que deseja. A consulta utiliza as diretivas ID e IDREFS para sobrescrever os tipos nos nomes das colunas (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;

Consulte também