Formattazione XML sul lato client e sul lato server (SQLXML 4.0)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure

In questo argomento vengono descritte le differenze generali tra la formattazione XML sul lato client e quella sul lato server in SQLXML.

Query su più set di righe non supportate nella formattazione sul lato client

Le query che generano più set di righe non sono supportate quando si utilizza la formattazione XML sul lato client. Supporre, ad esempio, di disporre di una directory virtuale nella quale è stata specificata la formattazione sul lato client. Si consideri questo modello di esempio con due istruzioni SELECT in un blocco sql:query>:<

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query>  
     SELECT FirstName FROM Person.Contact FOR XML Nested;   
     SELECT LastName FROM Person.Contact FOR XML Nested    
  </sql:query>  
</ROOT>  

È possibile eseguire questo modello nel codice dell'applicazione ma viene restituito un errore, poiché la formattazione XML sul lato client non supporta la formattazione di più set di righe. Se si specificano le query in due blocchi sql:query> separati<, si otterranno i risultati desiderati.

timestamp viene mappato in modo diverso nella formattazione sul lato client e in quella sul lato server

Nella formattazione XML sul lato server, la colonna del database di tipo timestamp viene mappata al tipo i8 XDR (quando l'opzione XMLDATA viene specificata nella query).

Nella formattazione XML sul lato client, la colonna del database di tipo timestamp esegue il mapping all'URI o al tipo XDR bin.base64 (a seconda che l'opzione base64 binaria sia specificata nella query). Il tipo bin.base64 XDR è utile se si usano le funzionalità updategram e bulkload, perché questo tipo viene convertito nel tipo timestamp di SQL Server. In questo modo, l'operazione di inserimento, aggiornamento o eliminazione viene eseguita correttamente.

Tipi VARIANT completi utilizzati nella formattazione sul lato server

Nella formattazione XML sul lato server vengono utilizzati i tipi VARIANT completi. Se si utilizza la formattazione XML sul lato client, le varianti vengono convertite in una stringa Unicode e i sottotipi di VARIANT non vengono utilizzati.

Modalità NESTED e modalità AUTO

La modalità NESTED di FOR XML sul lato client è simile alla modalità AUTO di FOR XML sul lato server, con le eccezioni seguenti:

Quando si esegue una query sulle viste utilizzando la modalità AUTO sul lato server, viene restituito il nome della vista come nome dell'elemento nel codice XML risultante.

Si supponga, ad esempio, che nella tabella Person.Contact della tabella AdventureWorksdatabase venga creata la visualizzazione seguente:

CREATE VIEW ContactView AS (SELECT ContactID as CID,  
                               FirstName  as FName,  
                               LastName  as LName  
                        FROM Person.Contact)  

Nel modello seguente viene specificata una query sulla vista ContactView e viene inoltre specificata la formattazione XML sul lato server:

 <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT *  
    FROM   ContactView  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

Quando si esegue il modello, viene restituito il seguente codice XML. Vengono visualizzati solo i risultati parziali. Si noti che i nomi degli elementi sono i nomi delle viste su cui viene eseguita la query.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <ContactView CID="1" FName="Gustavo" LName="Achong" />   
  <ContactView CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

Quando si specifica la formattazione XML sul lato client tramite la modalità NESTED corrispondente, vengono restituiti i nomi delle tabelle di base come nomi degli elementi nel codice XML risultante. Ad esempio, il modello modificato seguente esegue la stessa istruzione SELECT, ma la formattazione XML viene eseguita sul lato client( ovvero, client-side-xml è impostata su true nel modello):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT *  
    FROM   ContactView  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

L'esecuzione di questo modello genera il seguente codice XML. Notare che in questo caso il nome dell'elemento è il nome della tabella di base.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact CID="1" FName="Gustavo" LName="Achong" />   
  <Person.Contact CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

Quando si utilizza la modalità AUTO di FOR XML sul lato server, vengono restituiti gli alias delle tabelle specificati nella query come nomi degli elementi nel codice XML risultante.

Considerare ad esempio il modello seguente:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

L'esecuzione di questo modello genera il seguente codice XML.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <C fname="Gustavo" lname="Achong" />   
  <C fname="Catherine" lname="Abel" />   
...  
</ROOT>   

Quando si utilizza la modalità NESTED di FOR XML sul lato client, vengono restituiti i nomi delle tabelle come nomi degli elementi nel codice XML risultante. Gli alias di tabella specificati nella query non vengono usati. Si consideri ad esempio questo modello:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

L'esecuzione di questo modello genera il seguente codice XML.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact fname="Gustavo" lname="Achong" />   
  <Person.Contact fname="Catherine" lname="Abel" />   
...  
</ROOT>  

Se si dispone di una query che restituisce colonne come query dbobject, non è possibile utilizzare gli alias per tali colonne.

Considerare ad esempio il modello seguente in cui viene eseguita una query che restituisce un ID dipendente e una foto.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query client-side-xml="1">  
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML NESTED, elements  
</sql:query>  
</ROOT>  

L'esecuzione di questo modello restituisce la colonna Photo come query dbobject. In questa query dbobject @P si riferisce a un nome della colonna che non esiste.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@P</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

Se la formattazione XML viene eseguita nel server (client-side-xml="0"), è possibile usare l'alias per le colonne che restituiscono query dbobject in cui vengono restituiti i nomi effettivi di tabella e colonna (anche se sono stati specificati alias). Ad esempio, il modello seguente esegue una query e la formattazione XML viene eseguita nel server (l'opzione client-side-xml non è specificata e l'opzione Esegui sul client non è selezionata per la radice virtuale). La query specifica anche la modalità AUTO (non la modalità NESTED sul lato client).

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query   
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML AUTO, elements  
</sql:query>  
</ROOT>  

Quando viene eseguito questo modello, viene restituito il documento XML seguente (notare che non vengono utilizzati gli alias nella query dbobject per la colonna LargePhoto):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@LargePhoto</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

XPath sul lato client e sul lato server

XPath sul lato client e XPath sul lato server funzionano allo stesso modo ad eccezione delle seguenti differenze:

  • Le conversioni dei dati applicate quando si utilizzano le query XPath sul lato client sono diverse da quelle applicate quando si utilizzano le query XPath sul lato server. XPath sul lato client utilizza la modalità CAST anziché la modalità CONVERT 126.

  • Quando si specifica client-side-xml="0" (false) in un modello, si richiede la formattazione XML lato server. Pertanto, non è possibile specificare FOR XML NESTED poiché il server non riconosce l'opzione NESTED e viene quindi generato un errore. È necessario utilizzare le modalità AUTO, RAW o EXPLICIT riconosciute dal server.

  • Quando si specifica client-side-xml="1" (true) in un modello, si richiede la formattazione XML sul lato client. In questo caso, è possibile specificare FOR XML NESTED. Se si specifica FOR XML AUTO, la formattazione XML viene eseguita sul lato server anche se nel modello è specificato client-side-xml="1 ".

Vedi anche

Considerazioni sulla sicurezza per FOR XML (SQLXML 4.0)
Formattazione XML sul lato client (SQLXML 4.0)
Formattazione XML sul lato server (SQLXML 4.0)