Condividi tramite


Utilizzo della modalità RAW

Nella modalità RAW, ogni riga del set di risultati della query viene trasformata in un elemento XML al quale è assegnato l'identificatore generico <row> o il nome di elemento specificato facoltativamente. Per impostazione predefinita, ogni valore di colonna del set di righe diverso da NULL viene mappato a un attributo dell'elemento <row>. Se alla clausola FOR XML viene aggiunta la direttiva ELEMENTS, ogni valore di colonna viene mappato a un sottoelemento dell'elemento <row>. Insieme alla direttiva ELEMENTS è possibile specificare facoltativamente l'opzione XSINIL per mappare i valori di colonna NULL del set di risultati a un elemento con l'attributo xsi:nil="true".

Per restituire i dati binari nel formato con codifica Base64, è necessario specificare l'opzione BINARY BASE64 nella clausola FOR XML. Se si recuperano dati binari nella modalità RAW senza specificare l'opzione BINARY BASE64, verrà generato un errore.

È possibile richiedere uno schema per il codice XML risultante. Se si specifica l'opzione XMLDATA, verrà restituito uno schema XDR inline. Se si specifica l'opzione XMLSCHEMA, verrà restituito uno schema XDS inline. che viene visualizzato all'inizio dei dati. Nel risultato, il riferimento allo spazio dei nomi dello schema viene ripetuto in ogni elemento di livello principale.

Esempi

Le query negli esempi seguenti illustrano l'utilizzo della modalità FOR XML RAW con varie opzioni. Molte di queste query vengono eseguite sui documenti XML con istruzioni per la produzione di biciclette, archiviati nella colonna Instructions della tabella ProductModel. Per ulteriori informazioni sulle istruzioni XML, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks.

A. Recupero delle informazioni relative al modello del prodotto in formato XML

La query seguente restituisce le informazioni relative al modello del prodotto. La modalità RAW è specificata nella clausola FOR XML.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW;
GO

Risultato parziale:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

<row ProductModelID="119" Name="Bike Wash" />

Per recuperare codice XML incentrato sugli elementi, è possibile specificare la direttiva ELEMENTS.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, ELEMENTS;
GO

Risultato:

<row>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</row>
<row>
  <ProductModelID>119</ProductModelID>
  <Name>Bike Wash</Name>
</row>

È possibile specificare facoltativamente la direttiva TYPE per recuperare risultati di tipo xml. Il contenuto dei risultati non viene modificato dalla direttiva TYPE. Viene modificato solo il tipo di dati dei risultati.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE ;
GO

B. Specifica di XSINIL insieme alla direttiva ELEMENTS per generare elementi per i valori di colonna NULL

La query seguente specifica la direttiva ELEMENTS per generare codice XML incentrato sugli elementi dai risultati della query.

USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS;
GO

Di seguito è riportato il risultato parziale.

<row>
  <ProductID>1</ProductID>
  <Name>Adjustable Race</Name>
</row>
...
<row>
  <ProductID>317</ProductID>
  <Name>LL Crankarm</Name>
  <Color>Black</Color>
</row>

Nella colonna Color sono presenti valori NULL per alcuni prodotti e pertanto nel codice XML risultante non verrà generato l'elemento <Color> corrispondente. Se si aggiunge la direttiva XSINIL insieme a ELEMENTS, è possibile generare l'elemento <Color> anche per i valori NULL relativi al colore nel set dei risultati.

USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS XSINIL

Risultato parziale:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ProductID>1</ProductID>
  <Name>Adjustable Race</Name>
  <Color xsi:nil="true" />
</row>
...
<row>
  <ProductID>317</ProductID>
  <Name>LL Crankarm</Name>
  <Color>Black</Color>
</row>

C. Richiesta di schemi per il risultato tramite le opzioni XMLDATA e XMLSCHEMA

La query seguente restituisce lo schema XML-DATA che descrive la struttura del documento.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLDATA
GO

Risultato:

<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" 
        xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <ElementType name="row" content="empty" model="closed">
    <AttributeType name="ProductModelID" dt:type="i4" />
    <AttributeType name="Name" dt:type="string" />
    <attribute type="ProductModelID" />
    <attribute type="Name" />
  </ElementType>
</Schema>
<row xmlns="x-schema:#Schema1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="x-schema:#Schema1" ProductModelID="119" Name="Bike Wash" />

[!NOTA] <Schema> viene dichiarato come uno spazio dei nomi. Per evitare conflitti a livello di spazi dei nomi quando vengono richiesti più schemi XML-Data in query FOR XML diverse, l'identificatore dello spazio dei nomi (in questo esempio, Schema1 cambia a ogni esecuzione della query. Tale identificatore è composto da Scheman, dove n è un numero intero.

È possibile richiedere lo schema XSD per il risultato specificando l'opzione XMLSCHEMA.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA
GO

Risultato:

<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="row">
    <xsd:complexType>
      <xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
      <xsd:attribute name="Name" use="required">
        <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
          <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
            <xsd:maxLength value="50" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="119" Name="Bike Wash" />

Come argomento facoltativo di XMLSCHEMA, in FOR XML è possibile specificare l'URI dello spazio dei nomi di destinazione. Nello schema verrà restituito lo spazio dei nomi di destinazione specificato,. che rimane invariato a ogni esecuzione della query. Ad esempio, nella versione modificata della query precedente illustrata di seguito è incluso come argomento l'URI dello spazio dei nomi 'urn:example.com'.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA ('urn:example.com')
GO

Risultato:

<xsd:schema targetNamespace="urn:example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="row">
    <xsd:complexType>
      <xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
      <xsd:attribute name="Name" use="required">
        <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
          <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
            <xsd:maxLength value="50" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<row xmlns="urn:example.com" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:example.com" ProductModelID="119" Name="Bike Wash" />

D. Recupero di dati binari

La query seguente restituisce la foto del prodotto archiviata in una colonna di tipo varbinary(max). L'opzione BINARY BASE64 specificata nella query consente di restituire i dati binari nel formato con codifica Base64.

USE AdventureWorks
GO
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=1
FOR XML RAW, BINARY BASE64 ;
GO

Risultato:

<row ProductModelID="1" ThumbNailPhoto="base64 encoded binary data"/>

E. Ridenominazione dell'elemento <row>

Nella modalità RAW viene creato un elemento <row> per ogni riga del set di risultati. È possibile specificare facoltativamente un nome diverso per l'elemento impostando un argomento facoltativo per la modalità RAW, come illustrato nella query seguente. La query restituisce un elemento <ProductModel> per ogni riga del set di righe.

SELECT ProductModelID, Name 
FROM Production.ProductModel
WHERE ProductModelID=122
FOR XML RAW ('ProductModel'), ELEMENTS
GO

Di seguito è riportato il risultato. Nella query viene aggiunta la direttiva ELEMENTS e pertanto il risultato è incentrato sugli elementi.

<ProductModel>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</ProductModel> 

F. Specifica di un elemento principale per il codice XML generato da FOR XML

È possibile richiedere un singolo elemento principale per il codice XML risultante specificando l'opzione ROOT nella query FOR XML, come illustrato nella query seguente. L'argomento specificato per la direttiva ROOT consente di ottenere il nome dell'elemento principale.

USE AdventureWorks;
GO
SELECT ProductModelID, Name 
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119 or ProductModelID=115
FOR XML RAW, ROOT('MyRoot')
go

Risultato:

<MyRoot>
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />
  <row ProductModelID="119" Name="Bike Wash" />
  <row ProductModelID="115" Name="Cable Lock" />
</MyRoot>

G. Esecuzione di query sulle colonne di tipo xml

La query seguente include colonne di tipo xml e recupera l'ID del modello del prodotto, il nome e le fasi di produzione nel primo centro di lavorazione dalla colonna Instructions di tipo xml.

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') 
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
GO

Di seguito è riportato il risultato. Si noti che nella tabella sono archiviate le istruzioni di produzione relative unicamente ad alcuni modelli del prodotto. Nel risultato, le fasi di produzione vengono restituite come sottoelementi dell'elemento <ProductModelData>.

<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
    <MI:step> ... </MI:step>
    <MI:step> ... </MI:step>
 </ProductModelData>

Se la query specifica un nome di colonna per il codice XML restituito dalla query XQuery, come illustrato nell'istruzione SELECT seguente, viene eseguito il wrapping delle fasi di produzione nell'elemento con il nome specificato.

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
go

Risultato:

<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
  <ManuSteps>
    <MI:step ... </MI:step>
    <MI:step ... </MI:step>
  </ManuSteps>
</ProductModelData>

La query seguente specifica la direttiva ELEMENTS. e pertanto il risultato restituito sarà incentrato sugli elementi. L'opzione XSINIL specificata insieme alla direttiva ELEMENTS restituisce gli elementi <ManuSteps> anche se la colonna corrispondente nel set di righe è NULL.

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData'), root('MyRoot'), ELEMENTS XSINIL
go

Risultato:

<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   ...
  <ProductModelData>
    <ProductModelID>6</ProductModelID>
    <Name>HL Road Frame</Name>
    <ManuSteps xsi:nil="true" />
  </ProductModelData>
  <ProductModelData>
    <ProductModelID>7</ProductModelID>
    <Name>HL Touring Frame</Name>
    <ManuSteps>
      <MI:step ... </MI:step>
      <MI:step ...</MI:step>
       ...
    </ManuSteps>
  </ProductModelData>
</MyRoot>

H. Aggiunta di spazi dei nomi tramite WITH XMLNAMESPACES

Per esempi, vedere Aggiunta di spazi dei nomi tramite WITH XMLNAMESPACES.

Vedere anche

Riferimento

Utilizzo della modalità AUTO
Utilizzo della modalità EXPLICIT
Costruzione di codice XML tramite la clausola FOR XML

Concetti

Aggiunta di spazi dei nomi tramite WITH XMLNAMESPACES
Utilizzo della modalità PATH

Altre risorse

SELECT (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005