Użyj zagnieżdżonych zapytań FOR XML
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Typ danych xml oraz dyrektywa TYPE w zapytaniach FOR XML umożliwiają, aby zwracany kod XML mógł być przetwarzany zarówno na serwerze, jak i na kliencie.
Przetwarzanie ze zmiennymi typu xml
Możesz przypisać wynik zapytania FOR XML do zmiennej typu xml lub użyć XQuery, aby wykonać zapytanie o wynik, i przypisać go do zmiennej typu xml, aby go dalej przetwarzać.
DECLARE @x xml
SET @x=(SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE)
SELECT @x
-- Result
--<row ProductModelID="122" Name="All-Purpose Bike Stand" />
--<row ProductModelID="119" Name="Bike Wash" />
Można dodatkowo przetworzyć kod XML zwrócony w zmiennej @x
, przy użyciu jednej z metod typu danych XML. Można na przykład pobrać wartość atrybutu ProductModelID
przy użyciu metody value().
DECLARE @i int;
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));
SELECT @i;
W poniższym przykładzie wynik zapytania FOR XML
jest zwracany jako typ xml, ponieważ dyrektywa TYPE
jest określona w klauzuli FOR XML
.
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot');
Jest to wynik:
<myRoot>
<row ProductModelID="122" Name="All-Purpose Bike Stand" />
<row ProductModelID="119" Name="Bike Wash" />
</myRoot>
Ponieważ wynikiem jest typu xml, można określić jedną z metod typów danych xml bezpośrednio względem tego XML, co ilustruje poniższe zapytanie. W zapytaniu metoda query() (xml Data Type) jest używana do pobierania pierwszego elementu podrzędnego <row>
elementu <myRoot>
.
SELECT (SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');
Jest to wynik:
<row ProductModelID="122" Name="All-Purpose Bike Stand" />
Zwraca wyniki wewnętrznego zapytania FOR XML do zapytań zewnętrznych jako instancje typu XML.
Można pisać zagnieżdżone zapytania FOR XML
, w których wynik zapytania wewnętrznego jest zwracany jako typ xml do zapytania zewnętrznego. Na przykład:
SELECT Col1,
Col2,
( SELECT Col3, Col4
FROM T2
WHERE T2.Col = T1.Col
...
FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;
Zwróć uwagę na następujące elementy z poprzedniego zapytania:
Kod XML wygenerowany przez zapytanie
FOR XML
wewnętrznego jest dodawany do kodu XML wygenerowanego przez zewnętrznyFOR XML
.Zapytanie wewnętrzne określa dyrektywę
TYPE
. W związku z tym dane XML zwracane przez zapytanie wewnętrzne mają typ xml. Jeśli dyrektywa TYPE nie jest określona, wynik zapytania wewnętrznegoFOR XML
jest zwracany jako nvarchar(max), a dane XML są ztytucjonalizowane.
Kontrolowanie kształtu wynikowych danych XML
Zagnieżdżone zapytania XML zapewniają większą kontrolę nad definiowaniem kształtu wynikowych danych XML. Zagnieżdżone zapytania FOR XML umożliwiają konstruowanie kodu XML, który jest częściowo skoncentrowany na atrybutach i częściowo skoncentrowany na elementach.
Aby uzyskać więcej informacji na temat określania XML skoncentrowanego na atrybutach i elementach z zagnieżdżonymi zapytaniami FOR XML, zobacz FOR XML Query Compared to Nested FOR XML Query, Shape XML with Nested FOR XML Queries.
Hierarchie XML, które zawierają elementy równorzędne, można wygenerować przez określenie zagnieżdżonego trybu AUTO dla zapytań XML. Aby uzyskać więcej informacji, zobacz Generuj elementy równorzędne za pomocą zagnieżdżonego zapytania trybu automatycznego.
Niezależnie od używanego trybu zagnieżdżone zapytania FOR XML zapewniają większą kontrolę w opisywaniu kształtu wynikowego kodu XML. Mogą być używane zamiast zapytań w trybie JAWNYM.
Przykłady
Poniższe tematy zawierają przykłady zagnieżdżonych zapytań FOR XML.
Zapytanie FOR XML w porównaniu z zagnieżdżonym zapytaniem FOR XML
Porównuje jednopoziomowe zapytanie FOR XML z zagnieżdżonym zapytaniem FOR XML. W tym przykładzie przedstawiono sposób określania zarówno XML skoncentrowanego na atrybutach, jak i XML skoncentrowanego na elementach jako wynik zapytania.Generowanie rodzeństwa za pomocą zagnieżdżonego zapytania w trybie AUTO
Pokazuje, jak wygenerować elementy równorzędne przy użyciu zagnieżdżonego zapytania w trybie AUTO.Zastosowanie zagnieżdżonych zapytań XML w ASP.NET
Pokazuje, jak aplikacja ASPX może używać kodu XML FOR do zwracania kodu XML z programu SQL Server.Kształtowanie XML za pomocą zagnieżdżonych zapytań FOR XML
Pokazuje, jak używać zagnieżdżonych zapytań XML do kontrolowania struktury dokumentu XML utworzonego przez program SQL Server.