Condividi tramite


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

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. Considerare 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 di database del tipo timestamp viene mappata al tipo XDR i8, quando viene specificata l'opzione XMLDATA nella query.

Nella formattazione XML sul lato client la colonna di database del tipo timestamp viene mappata al tipo XDR uri o bin.base64, a seconda che venga specificata l'opzione binary base64 nella query. Il tipo XDR bin.base64 è utile se si utilizzano le funzionalità di updategram e caricamento bulk, poiché 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 venga creata la vista seguente nella tabella Person.Contact del database AdventureWorks:

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. Notare che i nomi degli elementi sono i nomi delle viste sulle quali è stata 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, nel modello modificato seguente viene eseguita la stessa istruzione SELECT, ma la formattazione XML viene eseguita sul lato client, ovvero client-side-xml è impostato 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 delle tabelle specificati nella query non vengono utilizzati. Considerare ad esempio il modello seguente:

<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=&apos;5&apos;]/@P</LargePhoto>
  </Production.ProductPhoto>
</ROOT>

Se la formattazione XML viene eseguita sul server (client-side-xml = "0"), è possibile utilizzare l'alias per le colonne che restituiscono le query dbobject in cui vengono restituiti i nomi effettivi delle tabelle e delle colonne, anche se sono stati specificati gli alias. Ad esempio, nel modello seguente viene eseguita una query e la formattazione XML viene eseguita sul server (l'opzione client-side-xml non viene specificata e l'opzione Run On Client non viene 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=&apos;5&apos;]/@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, viene indicata la formattazione XML sul 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, viene indicata la formattazione XML sul lato client. In questo caso, è possibile specificare FOR XML NESTED. Se si specifica FOR XML AUTO, si verifica la formattazione XML sul lato server anche se nel modello viene specificato client-side-xml = "1".