Esempio: specifica delle direttive ID e IDREFS
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure
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. In questo modo è possibile creare collegamenti tra più documenti, in modo analogo alla relazione esistente tra chiave primaria e chiave esterna nei database relazionali.
Nell'esempio seguente viene illustrato l'utilizzo delle direttive ID e IDREFS per la creazione di attributi dei tipi ID e IDREFS . Poiché gli ID non possono essere valori Integer, nell'esempio i valori di ID vengono convertiti, ovvero ne viene eseguito il cast di tipo. Vengono utilizzati prefissi per i valori degli ID.
Si supponga di voler generare 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 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
. Poiché un cliente può inviare più ordini, viene utilizzato il tipo IDREFS
.
Anche gli attributi IDREFS hanno più di un valore. È pertanto necessario utilizzare una clausola SELECT separata che riutilizzerà le stesse informazioni di Tag, Parent e colonna chiave. È 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.
Di seguito è riportata la query che genera il codice XML desiderato. La query utilizza le direttive ID
e IDREFS
per sovrascrivere i tipi nei nomi di colonna (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;