Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Toto téma popisuje obecné rozdíly mezi formátováním XML na straně klienta a serveru v SQLXML.
Více dotazů na sady řádků, které nejsou podporovány ve formátování na straně klienta
Dotazy, které generují více řádků, nejsou podporovány, pokud používáte formátování XML na straně klienta. Například předpokládejme, že máte virtuální adresář, ve kterém je specifikováno klientské formátování. Uvažujme tuto ukázkovou šablonu, která obsahuje dva příkazy SELECT v bloku 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>
Tuto šablonu můžete spustit v aplikačním kódu a zobrazí se chyba, protože formátování XML na straně klienta nepodporuje formátování více řádků. Pokud zadáte dotazy ve dvou samostatných <blokech sql:query> , dostanete požadované výsledky.
Časové razítka se v klientském a serverovém formátování mapují odlišně
Při serverovém XML formátování se sloupec časového razítka databáze mapuje na typ i8 XDR (pokud je v dotazu specifikována možnost XMLDATA).
Při formátování XML na straně klienta se sloupec časového razítka databáze mapuje buď na uri , nebo na typ bin.base64 XDR (v závislosti na tom, zda je v dotazu specifikována binární volba base64). Typ bin.base64 XDR je užitečný, pokud používáte funkce updategram a bulkload, protože tento typ je převeden na časové razítko SQL Serveru. Tímto způsobem je operace vložení, aktualizace nebo odstranění úspěšná.
Deep VARIANTs se používají ve formátování na straně serveru
Při serverovém XML formátování se používají hluboké typy typu VARIANT. Pokud použijete formátování XML na straně klienta, varianty se převedou do řetězců Unicode a podtypy VARIANT se nepoužívají.
NESTED režim vs. AUTO režim
NESTED režim klientského FOR XML je podobný AUTO režimu serverového FOR XML, s následujícími výjimkami:
Když dotazujete pohledy pomocí AUTO režimu na straně serveru, název pohledu se vrátí jako název prvku ve výsledném XML.
Například předpokládejme, že následující zobrazení je vytvořeno v tabulce Person.Contact v databázi AdventureWorks:
CREATE VIEW ContactView AS (SELECT ContactID as CID,
FirstName as FName,
LastName as LName
FROM Person.Contact)
Následující šablona specifikuje dotaz proti zobrazení ContactView a také specifikuje serverové XML formátování:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT *
FROM ContactView
FOR XML AUTO
</sql:query>
</ROOT>
Když šablonu spustíte, vrátí se následující XML. (Jsou zobrazeny pouze částečné výsledky.) Všimněte si, že názvy prvků jsou názvy pohledů, proti kterým je dotaz vykonán.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ContactView CID="1" FName="Gustavo" LName="Achong" />
<ContactView CID="2" FName="Catherine" LName="Abel" />
...
</ROOT>
Když specifikujete formátování XML na straně klienta pomocí odpovídajícího NESTED režimu, základní názvy tabulek se vrátí jako názvy prvků ve výsledném XML. Například následující upravená šablona vykoná stejný příkaz SELECT, ale formátování XML se provádí na straně klienta (tedy v šabloně je na straně klienta nastaveno na true):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT *
FROM ContactView
FOR XML NESTED
</sql:query>
</ROOT>
Spuštění této šablony vytvoří následující XML. Všimněte si, že název prvku je v tomto případě název základní tabulky.
<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>
Když použijete AUTO režim serverové PRO XML, aliasy tabulek specifikované v dotazu se vrátí jako názvy prvků ve výsledném XML.
Například zvažte tuto šablonu:
<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>
Spuštění šablony vytvoří následující XML:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<C fname="Gustavo" lname="Achong" />
<C fname="Catherine" lname="Abel" />
...
</ROOT>
Když použijete NESTED režim klientské strany FOR XML, názvy tabulek se ve výsledném XML vrátí jako názvy prvků. (Tabulkové aliasy specifikované v dotazu se nepoužívají.) Například zvažte tuto šablonu:
<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>
Spuštění šablony vytvoří následující XML:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact fname="Gustavo" lname="Achong" />
<Person.Contact fname="Catherine" lname="Abel" />
...
</ROOT>
Pokud máte dotaz, který vrací sloupce jako dotazy na dbobject, nemůžete pro tyto sloupce používat aliasy.
Například zvažme následující šablonu, která vykoná dotaz s vrácením identifikace zaměstnance a fotografie.
<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>
Spuštění této šablony vrací sloupec Photo jako dotaz na dbobject. V tomto dotazu dbobject označuje název sloupce, @P který neexistuje.
<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>
Pokud je XML formátování provedeno na serveru (klient-side-xml="0"), můžete použít alias pro sloupce, které vracejí dotazy dbobject, ve kterých se vracejí skutečné názvy tabulek a sloupců (i když máte zadané aliasy). Například následující šablona vykoná dotaz a XML formátování se provádí na serveru (možnost klient-side-xml není specifikována a volba Run On Client není vybrána pro virtuální kořen). Dotaz také specifikuje režim AUTO (nikoli klientský NESTED režim).
<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>
Když je tato šablona vykonána, vrátí se následující XML dokument (všimněte si, že aliasy se v dotazu dbobject pro sloupec LargePhoto nepoužívají):
<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>
Klientská vs. serverová XPath
Klientské XPath a serverové XPath fungují stejně, kromě těchto rozdílů:
Převody dat, které se aplikují při použití klientských XPath dotazů, se liší od těch, které se aplikují při serverových XPath dotazech. Klientský XPath používá CAST místo režimu CONVERT 126.
Když v šabloně zadáte klientskou stránku-xml="0" (false), požadujete serverové XML formátování. Proto nemůžete specifikovat PRO XML NESTED, protože server nerozpozná možnost VNOŘENÝ. Tím se vygeneruje chyba. Musíte používat režimy AUTO, RAW nebo EXPLICIT, které server rozpoznává.
Když v šabloně specifikujete klientskou stranu xml="1" (true), požadujete formátování XML na straně klienta. V tomto případě můžete specifikovat PRO XML VNOŘENÉ. Pokud specifikujete PRO XML AUTO, formátování XML probíhá na straně serveru, i když v šabloně je uvedeno klientské xml="1".
Viz také
PRO XML bezpečnostní úvahy (SQLXML 4.0)
Formátování XML na straně klienta (SQLXML 4.0)
Serverové formátování XML (SQLXML 4.0)