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.
In questo argomento vengono descritte le differenze generali tra la formattazione XML lato client e lato server in SQLXML.
Più query del set di righe non supportate nella formattazione lato client
Le query che generano più set di righe non sono supportate quando si usa la formattazione XML lato client. Si supponga, ad esempio, di avere una directory virtuale in cui è specificata la formattazione 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 e viene restituito un errore, perché la formattazione XML 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 Esegue il mapping in modo diverso in Client- vs. Formattazione lato server
Nella formattazione XML lato server, la colonna di database di timestamp tipo esegue il mapping al tipo i8 XDR (quando l'opzione XMLDATA viene specificata nella query).
Nella formattazione XML lato client, la colonna del database di timestamp tipo esegue il bin.base64 mapping al uri tipo o XDR , a seconda che nella query sia specificata l'opzione binary base64. Il bin.base64 tipo XDR è utile se si usano le funzionalità updategram e bulkload, perché questo tipo viene convertito nel tipo di SQL Server timestamp . In questo modo, l'operazione di inserimento, aggiornamento o eliminazione ha esito positivo.
I VARIANT profondi vengono usati nella formattazione lato server
Nella formattazione XML lato server vengono utilizzati i tipi profondi di un tipo VARIANT. Se si utilizza la formattazione XML lato client, le varianti vengono convertite in stringa Unicode e i sottotipi di VARIANT non vengono utilizzati.
Modalità NESTED e modalità AUTO
La modalità NESTED del lato client FOR XML è simile alla modalità AUTO di FOR XML lato server, con le eccezioni seguenti:
Quando si eseguono query sulle viste usando la modalità AUTO sul lato server, il nome della visualizzazione viene restituito 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)
Il modello seguente specifica una query sulla vista ContactView e specifica anche 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 codice XML seguente. 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 lato client utilizzando la modalità NESTED corrispondente, i nomi della tabella di base vengono restituiti 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 produce il codice XML seguente. Si noti che il nome dell'elemento è il nome della tabella di base in questo caso.
<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, gli alias di tabella specificati nella query vengono restituiti come nomi di elemento nel codice XML risultante.
Si consideri ad esempio questo modello:
<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 del modello produce il codice XML seguente:
<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 del file FOR XML sul lato client, i nomi delle tabelle vengono restituiti come nomi di elemento 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 del modello produce il codice XML seguente:
<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 usare alias per queste colonne.
Si consideri ad esempio il modello seguente, che esegue 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 si @P riferisce a un nome di 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 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 questo modello viene eseguito, viene restituito il documento XML seguente (si noti che gli alias non vengono usati 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>
Lato client e XPath lato server
XPath sul lato client e XPath sul lato server funzionano allo stesso modo, ad eccezione di queste differenze:
Le conversioni di dati applicate quando si usano query XPath lato client sono diverse da quelle applicate quando si usano query XPath lato server. XPath lato client usa CAST anziché la modalità CONVERT 126.
Quando si specifica client-side-xml="0" (false) in un modello, si richiede la formattazione XML lato server. Non è pertanto possibile specificare FOR XML NESTED perché il server non riconosce l'opzione NESTED. e viene quindi generato un errore. È necessario usare le modalità AUTO, RAW o EXPLICIT, che il server riconosce.
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 ".
Vedere anche
Considerazioni sulla sicurezza FOR XML (SQLXML 4.0)
Formattazione XML lato client (SQLXML 4.0)
Formattazione XML lato server (SQLXML 4.0)