Condividi tramite


Esempio: Specificazione delle direttive ID e IDREFS

Un attributo di elemento può essere specificato come ID attributo di tipo e l'attributo IDREFS può quindi essere usato per farvi riferimento. Ciò consente collegamenti all'interno del documento ed è simile alle relazioni chiave primaria e di chiave esterna nei database relazionali.

In questo esempio viene illustrato come usare le direttive ID e IDREFS per creare attributi di tipi ID e IDREFS. Poiché gli ID non possono essere valori interi, i valori ID in questo esempio vengono convertiti. In altre parole, vengono inseriti nel cast. I prefissi sono utilizzati per i valori ID.

Si supponga di voler costruire codice XML come illustrato di seguito:

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

L'attributo SalesOrderIDList dell'elemento <Customer> è un attributo multivalore che fa riferimento all'attributo SalesOrderID dell'elemento.<SalesOrder> Per stabilire questo collegamento, l'attributo SalesOrderID deve essere dichiarato di ID tipo e l'attributo SalesOrderIDList dell'elemento><Customerdeve essere dichiarato di IDREFS tipo. Poiché un cliente può richiedere diversi ordini, viene usato il IDREFS tipo .

Anche gli elementi di IDREFS tipo hanno più di un valore. Pertanto, è necessario usare una clausola select separata che riutilicherà lo stesso tag, elemento padre e informazioni sulla colonna chiave. Deve ORDER BY quindi assicurarsi che la sequenza di righe che compongono i valori venga raggruppata sotto il IDREFS relativo elemento padre.

Si tratta della query che produce il codice XML desiderato. La query utilizza le direttive ID e IDREFS per sovrascrivere i tipi di dati nei nomi delle colonne (SalesOrder!2!SalesOrderID!ID, Customer!1!SalesOrderIDList!IDREFS).

USE AdventureWorks2012;  
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.CustomerIDORDER BY [Customer!1!CustomerID] ,  
         [SalesOrder!2!SalesOrderID!ID],  
         [Customer!1!SalesOrderIDList!IDREFS]  
FOR XML EXPLICIT;  

Vedere anche

Utilizzo della modalità EXPLICIT con FOR XML