Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Dit onderwerp beschrijft de algemene verschillen tussen client- en server-side XML-opmaak in SQLXML.
Meerdere rijset-queries niet ondersteund in client-side opmaak
Queries die meerdere rijsets genereren worden niet ondersteund wanneer je client-side XML-opmaak gebruikt. Stel bijvoorbeeld dat je een virtuele map hebt waarin client-side opmaak is opgegeven. Beschouw dit voorbeeldsjabloon, dat twee SELECT-statements bevat in een <sql:query-blok> :
<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>
Je kunt dit sjabloon uitvoeren in applicatiecode en er wordt een foutmelding teruggegeven, omdat client-side XML-opmaak het opmaken van meerdere rijsets niet ondersteunt. Als je de queries specificeert in twee aparte <sql:query-blokken> , krijg je de gewenste resultaten.
Tijdstempel wordt anders toegewezen in client- versus server-side opmaak
Bij server-side XML-opmaak wordt de databasekolom van het tijdstempeltype gekoppeld aan het i8 XDR-type (wanneer de XMLDATA-optie in de query wordt opgegeven).
In client-side XML-opmaak wordt de databasekolom met het tijdstempeltype gekoppeld aan ofwel de uri of het bin.base64 XDR-type (afhankelijk van of de binaire base64-optie in de query is opgegeven). Het type bin.base64 XDR is handig als je de updategram- en bulkload-functies gebruikt, omdat dit type wordt omgezet naar het SQL Server-tijdstempeltype . Op deze manier slaagt de invoeg-, update- of verwijderingsoperatie.
Deep VARIANTs worden gebruikt in server-side opmaak
In server-side XML-opmaak worden de diepe types van een VARIANT-type gebruikt. Als je client-side XML-opmaak gebruikt, worden de varianten omgezet naar een Unicode-string en worden de subtypes van VARIANT niet gebruikt.
NESTED Mode vs. AUTO Mode
De NESTED modus van de client-side FOR XML lijkt op de AUTO-modus van server-side FOR XML, met de volgende uitzonderingen:
Wanneer je weergaven opvraagt in AUTO-modus aan de serverzijde, wordt de weergavenaam teruggegeven als de elementnaam in de resulterende XML.
Stel bijvoorbeeld dat de volgende weergave wordt aangemaakt op de Person.Contact-tabel in de AdventureWorksdatabase:
CREATE VIEW ContactView AS (SELECT ContactID as CID,
FirstName as FName,
LastName as LName
FROM Person.Contact)
Het volgende sjabloon specificeert een query tegen de ContactView-weergave en specificeert ook server-side XML-opmaak:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT *
FROM ContactView
FOR XML AUTO
</sql:query>
</ROOT>
Wanneer je het sjabloon uitvoert, wordt de volgende XML teruggegeven. (Slechts gedeeltelijke resultaten worden getoond.) Let op dat de elementnamen de namen zijn van de weergaven waarop de query wordt uitgevoerd.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ContactView CID="1" FName="Gustavo" LName="Achong" />
<ContactView CID="2" FName="Catherine" LName="Abel" />
...
</ROOT>
Wanneer je client-side XML-opmaak specificeert met de bijbehorende NESTED-modus, worden de basistabelnaam(en) teruggegeven als de elementnaam in de resulterende XML. Bijvoorbeeld, de volgende herziene template voert dezelfde SELECT-instructie uit, maar de XML-opmaak wordt aan de clientzijde uitgevoerd (dat wil zeggen, client-side XML is in het sjabloon op true gezet):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT *
FROM ContactView
FOR XML NESTED
</sql:query>
</ROOT>
Het uitvoeren van dit sjabloon levert de volgende XML op. Let op dat de naam van het element in dit geval de naam van de basistabel is.
<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>
Wanneer je de AUTO-modus van de serverzijde VOOR XML gebruikt, worden de in de query gespecificeerde tabelaliasen teruggegeven als elementnamen in de resulterende XML.
Overweeg bijvoorbeeld deze template:
<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>
Het uitvoeren van het sjabloon levert de volgende XML op:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<C fname="Gustavo" lname="Achong" />
<C fname="Catherine" lname="Abel" />
...
</ROOT>
Wanneer je de NESTED-modus van de client-side FOR XML gebruikt, worden de tabelnamen teruggegeven als elementnamen in de resulterende XML. (Tabelaliasen die in de query worden gespecificeerd, worden niet gebruikt.) Overweeg bijvoorbeeld deze template:
<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>
Het uitvoeren van het sjabloon levert de volgende XML op:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact fname="Gustavo" lname="Achong" />
<Person.Contact fname="Catherine" lname="Abel" />
...
</ROOT>
Als je een query hebt die kolommen als dbobject-queries teruggeeft, kun je voor deze kolommen geen aliasen gebruiken.
Beschouw bijvoorbeeld het volgende sjabloon, dat een query uitvoert waarbij een werknemers-ID en een foto worden teruggegeven.
<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>
Het uitvoeren van deze template geeft de Foto-kolom terug als een dbobject-query. In deze dbobject-query @P verwijst naar een kolomnaam die niet bestaat.
<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>
Als de XML-opmaak op de server wordt gedaan (client-side-xml="0"), kun je de alias gebruiken voor de kolommen die dbobject-queries teruggeven waarin daadwerkelijke tabel- en kolomnamen worden teruggegeven (zelfs als je aliassen hebt gespecificeerd). Bijvoorbeeld, de volgende template voert een query uit, en de XML-opmaak wordt op de server uitgevoerd (de client-side-xml-optie is niet gespecificeerd en de optie Run On Client is niet geselecteerd voor de virtuele root). De query specificeert ook de AUTO-modus (niet de client-side NESTED modus).
<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>
Wanneer dit sjabloon wordt uitgevoerd, wordt het volgende XML-document teruggegeven (let op dat aliassen niet worden gebruikt in de dbobject-query voor de kolom 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>
Client-side vs. Server-side XPath
Client-side XPath en server-side XPath werken hetzelfde, behalve deze verschillen:
De dataconversies die worden toegepast wanneer je client-side XPath-queries gebruikt, verschillen van die welke worden toegepast bij server-side XPath-queries. Client-side XPath gebruikt CAST in plaats van CONVERT-modus 126.
Wanneer je client-side-xml="0" (false) specificeert in een sjabloon, vraag je server-side XML-opmaak aan. Daarom kun je VOOR XML NESTED niet specificeren omdat de server de NESTED optie niet herkent. Dit veroorzaakt een fout. Je moet de AUTO-, RAW of EXPLICIT-modi gebruiken, die de server wel herkent.
Wanneer je client-side-xml="1" (true) specificeert in een sjabloon, vraag je client-side XML-opmaak. In dit geval kun je VOOR XML NESTED specificeren. Als je VOOR XML AUTO SPECIFICEERT, vindt de XML-opmaak plaats aan de serverzijde, hoewel client-side-xml="1" in het sjabloon is opgegeven.
Zie ook
FOR XML-beveiligingsoverwegingen (SQLXML 4.0)
Client-side XML-opmaak (SQLXML 4.0)
Server-side XML-opmaak (SQLXML 4.0)