Esempio: specifica delle direttive ID, IDREFSExample: Specifying the ID and IDREFS Directives

Un attributo dell'elemento può essere specificato come attributo di tipo ID e l'attributo IDREFS può quindi essere utilizzato per fare riferimento a tale attributo.An element attribute can be specified as an ID type attribute, and the IDREFS attribute can then be used to refer to it. In questo modo è possibile creare collegamenti tra più documenti, in modo analogo alla relazione esistente tra chiave primaria e chiave esterna nei database relazionali.This enables intra-document links and is similar to the primary key and foreign key relationships in relational databases.

Nell'esempio seguente viene illustrato l'utilizzo delle direttive ID e IDREFS per la creazione di attributi dei tipi ID e IDREFS .This example illustrates how the ID and IDREFS directives can be used to create attributes of ID and IDREFS types. Poiché gli ID non possono essere valori Integer, nell'esempio i valori di ID vengono convertiti,Because IDs cannot be integer values, the ID values in this example are converted. ovvero ne viene eseguito il cast di tipo.In other words, they are type casted. Vengono utilizzati prefissi per i valori degli ID.Prefixes are used for the ID values.

Si supponga di voler generare codice XML come illustrato di seguito:Assume that you want to construct XML as shown in the following:

<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 >.The SalesOrderIDList attribute of the < Customer > element is a multivalued attribute that refers to the SalesOrderID attribute of the < SalesOrder > element. Per stabilire il collegamento, è necessario dichiarare l'attributo SalesOrderID con il tipo di dati ID e l'attributo SalesOrderIDList dell'elemento < Customer> con il tipo di dati IDREFS.To establish this link, the SalesOrderID attribute must be declared of ID type, and the SalesOrderIDList attribute of the < Customer> element must be declared of IDREFS type. Poiché un cliente può inviare più ordini, viene utilizzato il tipo IDREFS.Because a customer can request several orders, the IDREFS type is used.

Anche gli attributi IDREFS hanno più di un valore.Elements of IDREFS type also have more than one value. È pertanto necessario utilizzare una clausola SELECT separata che riutilizzerà le stesse informazioni di Tag, Parent e colonna chiave.Therefore, you have to use a separate select clause that will reuse the same tag, parent, and key column information. È poi necessario usare ORDER BY per garantire che le sequenze di righe che compongono i valori IDREFS vengano visualizzate raggruppate sotto il rispettivo elemento padre.The ORDER BY then has to ensure that the sequence of rows that make up the IDREFS values appears grouped together under their parent element.

Di seguito è riportata la query che genera il codice XML desiderato.This is the query that produces the XML you want. La query utilizza le direttive ID e IDREFS per sovrascrivere i tipi nei nomi di colonna (SalesOrder!2!SalesOrderID!ID, Customer!1!SalesOrderIDList!IDREFS).The query uses the ID and IDREFS directives to overwrite the types in the column names (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 ancheSee Also

Utilizzo della modalità EXPLICIT con FOR XMLUse EXPLICIT Mode with FOR XML