Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Negli esempi seguenti viene illustrato l'uso della modalità PATH nella generazione di codice XML da una query SELECT. Molte di queste query vengono specificate nei documenti XML delle istruzioni per la produzione di biciclette archiviati nella colonna Istruzioni della tabella ProductModel.
Specificare una query in modalità PATH semplice
Questa query specifica una modalità FOR XML PATH.
USE AdventureWorks2012;
GO
SELECT
ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH;
GO
Il risultato seguente è il codice XML incentrato sugli elementi in cui ogni valore di colonna nel set di righe risultante viene sottoposto a wrapping in un elemento . Poiché la SELECT clausola non specifica alias per i nomi di colonna, i nomi degli elementi figlio generati corrispondono ai nomi di colonna corrispondenti nella SELECT clausola . Per ogni riga nel set di righe viene aggiunto un <row> tag.
<row>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</row>
<row>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</row>
Il risultato seguente è lo stesso della query in modalità RAW con l'opzione ELEMENTS specificata. Restituisce codice XML incentrato sugli elementi con un elemento predefinito <row> per ogni riga nel set di risultati.
USE AdventureWorks2012;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW, ELEMENTS;
Facoltativamente, è possibile specificare il nome dell'elemento di riga per sovrascrivere il valore predefinito <row>. Ad esempio, la query seguente restituisce l'elemento <ProductModel> per ogni riga nel set di righe.
USE AdventureWorks2012;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModel');
GO
Il codice XML risultante avrà un nome di elemento di riga specificato.
<ProductModel>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</ProductModel>
<ProductModel>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</ProductModel>
Se si specifica una stringa di lunghezza zero, l'elemento di wrapping non viene generato.
USE AdventureWorks2012;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('');
GO
Risultato:
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
Specifica dei nomi di colonna simili a XPath
Nella query seguente il ProductModelID nome della colonna specificato inizia con '@' e non contiene una barra ('/'). Pertanto, nell'XML risultante viene creato un attributo dell'elemento <row> con il valore di colonna corrispondente.
USE AdventureWorks2012;
GO
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('ProductModelData');
GO
Risultato:
< ProductModelData id="122">
<Name>All-Purpose Bike Stand</Name>
</ ProductModelData >
< ProductModelData id="119">
<Name>Bike Wash</Name>
</ ProductModelData >
È possibile aggiungere un singolo elemento di primo livello specificando l'opzione root in FOR XML.
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModelData'), root ('Root');
GO
Per generare una gerarchia, è possibile includere una sintassi simile a PATH. Ad esempio, modificare il nome della Name colonna in "SomeChild/ModelName" e si otterrà XML con la gerarchia, come illustrato in questo risultato:
<Root>
<ProductModelData id="122">
<SomeChild>
<ModelName>All-Purpose Bike Stand</ModelName>
</SomeChild>
</ProductModelData>
<ProductModelData id="119">
<SomeChild>
<ModelName>Bike Wash</ModelName>
</SomeChild>
</ProductModelData>
</Root>
Oltre all'ID e al nome del modello di prodotto, la query seguente recupera i percorsi di istruzioni di produzione per il modello di prodotto. Poiché la colonna Instructions è di xml tipo , il query() metodo del tipo di xml dati viene specificato per recuperare il percorso.
SELECT ProductModelID AS "@id",
Name,
Instructions.query('declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location
') AS ManuInstr
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH ('ProductModelData'), root ('Root');
GO
Di seguito è riportato il risultato parziale. Poiché la query specifica ManuInstr come nome di colonna, il codice XML restituito dal query() metodo viene sottoposto a wrapping in un <ManuInstr> tag come illustrato di seguito:
<Root>
<ProductModelData id="7">
<Name>HL Touring Frame</Name>
<ManuInstr>
<MI:Location xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
<MI:step>...</MI:step>...
</MI:Location>
...
</ManuInstr>
</ProductModelData>
</Root>
Nella query FOR XML precedente, potrebbe essere necessario includere i namespace per gli elementi <, Root, > e <, ProductModelData, >. A tale scopo, è prima possibile definire il prefisso all'associazione dello spazio dei nomi usando WITH XMLNAMESPACES e usando i prefissi nella query FOR XML. Per ulteriori informazioni, vedere Aggiungere namespace alle query con WITH XMLNAMESPACES.
USE AdventureWorks2012;
GO
WITH XMLNAMESPACES (
'uri1' AS ns1,
'uri2' AS ns2,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' as MI)
SELECT ProductModelID AS "ns1:ProductModelID",
Name AS "ns1:Name",
Instructions.query('
/MI:root/MI:Location
')
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH ('ns2:ProductInfo'), root('ns1:root');
GO
Si noti che il MI prefisso è definito anche in WITH XMLNAMESPACES. Di conseguenza, il query() metodo del xml tipo specificato non definisce il prefisso nel prologo della query. Risultato:
<ns1:root xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" xmlns="uri2" xmlns:ns2="uri2" xmlns:ns1="uri1">
<ns2:ProductInfo>
<ns1:ProductModelID>7</ns1:ProductModelID>
<ns1:Name>HL Touring Frame</ns1:Name>
<MI:Location xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
LaborHours="2.5" LotSize="100" MachineHours="3" SetupHours="0.5" LocationID="10" xmlns="">
<MI:step>
Insert <MI:material>aluminum sheet MS-2341</MI:material> into the <MI:tool>T-85A framing tool</MI:tool>.
</MI:step>
...
</MI:Location>
...
</ns2:ProductInfo>
</ns1:root>
Generazione di un elenco di valori tramite la modalità PATH
Per ogni modello di prodotto, questa query crea un elenco di valori di ID prodotto. Per ogni ID prodotto, la query costruisce <ProductName> anche elementi annidati, come illustrato in questo frammento XML:
<ProductModelData ProductModelID="7" ProductModelName="..."
ProductIDs="product id list in the product model" >
<ProductName>...</ProductName>
<ProductName>...</ProductName>
...
</ProductModelData>
Si tratta della query che produce il codice XML desiderato:
USE AdventureWorks2012;
GO
SELECT ProductModelID AS "@ProductModelID",
Name S "@ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')) S "@ProductIDs",
(SELECT Name AS "ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')) as "ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 or ProductModelID=9
FOR XML PATH('ProductModelData');
Nota quanto segue dalla query precedente:
Il primo annidato
SELECTrestituisce un elenco di ProductIDs usandodata()come nome di colonna. Poiché la query specifica una stringa vuota come nome dell'elemento di riga inFOR XML PATH, non viene generato alcun elemento. L'elenco di valori viene invece assegnato all'attributoProductID.Il secondo annidato
SELECTrecupera i nomi dei prodotti nel modello di prodotto. Genera gli elementi <ProductName> che vengono restituiti avvolti nell'elemento <ProductNames>, perché la query specificaProductNamescome nome della colonna.
Risultato parziale:
<ProductModelData PId="7"
ProductModelName="HL Touring Frame"
ProductIDs="885 887 ...">
<ProductNames>
<ProductName>HL Touring Frame - Yellow, 60</ProductName>
<ProductName>HL Touring Frame - Yellow, 46</ProductName></ProductNames>
...
</ProductModelData>
<ProductModelData PId="9"
ProductModelName="LL Road Frame"
ProductIDs="722 723 724 ...">
<ProductNames>
<ProductName>LL Road Frame - Black, 58</ProductName>
<ProductName>LL Road Frame - Black, 60</ProductName>
<ProductName>LL Road Frame - Black, 62</ProductName>
...
</ProductNames>
</ProductModelData>
La sottoquery che costruisce i nomi di prodotto restituisce il risultato come stringa entitizzata, che è quindi aggiunta all'XML. Aggiungendo la direttiva di tipo, FOR XML PATH (''), type, la sottoquery restituisce il risultato come tipo xml e non avviene alcuna conversione in entità.
USE AdventureWorks2012;
GO
SELECT ProductModelID AS "@ProductModelID",
Name AS "@ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')
) AS "@ProductIDs",
(
SELECT Name AS "ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH (''), type
) AS "ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 OR ProductModelID=9
FOR XML PATH('ProductModelData');
Aggiunta di namespace nel codice XML risultante
Come descritto in Aggiunta di namespace tramite WITH XMLNAMESPACES, è possibile usare WITH XMLNAMESPACES per includere i namespace nella modalità PATH delle query. Ad esempio, nella clausola SELECT, i nomi specificati includono prefissi dello spazio dei nomi. La seguente modalità di query PATH costruisce XML con namespace.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation')
GO
L'attributo @xml:lang aggiunto all'elemento <English> viene definito nello spazio dei nomi XML predefinito.
Risultato:
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
La query seguente è simile all'esempio C, ad eccezione del fatto che usa WITH XMLNAMESPACES per includere gli spazi dei nomi nel risultato XML. Per ulteriori informazioni, vedere Aggiungi namespace alle query con WITH XMLNAMESPACES.
USE AdventureWorks2012;
GO
WITH XMLNAMESPACES ('uri1' AS ns1, DEFAULT 'uri2')
SELECT ProductModelID AS "@ns1:ProductModelID",
Name AS "@ns1:ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')
) AS "@ns1:ProductIDs",
(
SELECT ProductID AS "@ns1:ProductID",
Name AS "@ns1:ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH , type
) AS "ns1:ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 OR ProductModelID=9
FOR XML PATH('ProductModelData'), root('root');
Risultato:
<root xmlns="uri2" xmlns:ns1="uri1">
<ProductModelData ns1:ProductModelID="7" ns1:ProductModelName="HL Touring Frame" ns1:ProductIDs="885 887 888 889 890 891 892 893">
<ns1:ProductNames>
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="885" ns1:ProductName="HL Touring Frame - Yellow, 60" />
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="887" ns1:ProductName="HL Touring Frame - Yellow, 46" />
...
</ns1:ProductNames>
</ProductModelData>
<ProductModelData ns1:ProductModelID="9" ns1:ProductModelName="LL Road Frame" ns1:ProductIDs="722 723 724 725 726 727 728 729 730 736 737 738">
<ns1:ProductNames>
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="722" ns1:ProductName="LL Road Frame - Black, 58" />
...
</ns1:ProductNames>
</ProductModelData>
</root>