Udostępnij za pośrednictwem


Użyj zagnieżdżonych zapytań FOR XML

Dotyczy:SQL ServerAzure SQL DatabaseAzure 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ętrzny FOR 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ętrznego FOR 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.