Udostępnij za pomocą


FOR XML (SQL Server)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Zapytanie SELECT zwraca wyniki jako zestaw wierszy. Opcjonalnie możesz pobrać formalne wyniki zapytania SQL jako XML, określając klauzulę FOR XML w zapytaniu. Klauzulę FOR XML można używać w zapytaniach najwyższego poziomu i w podzapytaniach. Klauzula najwyższego poziomu FOR XML może być używana tylko w instrukcji SELECT . W podzapytaniach FOR XML można używać w instrukcjach INSERT, UPDATEi DELETE . FOR XML można również używać w instrukcjach przypisania.

W klauzuli FOR XML należy określić jeden z następujących trybów:

  • RAW
  • AUTO
  • EXPLICIT
  • PATH

Tryb RAW generuje jeden <row> element na wiersz w zestawie wierszy zwracanym przez instrukcję SELECT . Hierarchię XML można wygenerować, pisząc zagnieżdżone FOR XML zapytania.

Tryb AUTO generuje zagnieżdżanie w wynikowym kodzie XML przy użyciu heurystyki na podstawie sposobu określenia instrukcji SELECT . Masz minimalną kontrolę nad kształtem wygenerowanego kodu XML. Zagnieżdżone FOR XML zapytania mogą być zapisywane w celu wygenerowania hierarchii XML poza kształtem XML generowanym przez AUTO heurystyki trybu.

Tryb EXPLICIT umożliwia większą kontrolę nad kształtem kodu XML. Możesz mieszać atrybuty i elementy, wybierając kształt kodu XML. Wymaga on określonego formatu dla wynikowego zestawu wierszy wygenerowanego z powodu wykonywania zapytania. Ten format zestawu wierszy jest następnie mapowany na kształt XML. Moc trybu polega na mieszaniu EXPLICIT atrybutów i elementów w dowolnej kolejności, tworzeniu otoek i zagnieżdżonych złożonych właściwościach, tworzeniu wartości rozdzielanych spacjami (na przykład OrderID atrybut może zawierać listę wartości identyfikatora zamówienia) i mieszaną zawartość.

Jednak zapytania w trybie pisania EXPLICIT mogą być kłopotliwe. Możesz użyć niektórych nowych FOR XML funkcji, takich jak pisanie zagnieżdżonych FOR XML RAWzapytań , AUTOlub PATH trybu i TYPE dyrektywy, zamiast używać EXPLICIT trybu do generowania hierarchii. Zagnieżdżone FOR XML zapytania mogą tworzyć dowolny kod XML, który można wygenerować przy użyciu EXPLICIT trybu . Aby uzyskać więcej informacji, zobacz Używanie zagnieżdżonych zapytań XML i dyrektywy TYPE w zapytaniach XML.

Tryb PATH wraz z funkcją zagnieżdżonego FOR XML zapytania zapewnia elastyczność EXPLICIT trybu w prostszy sposób.

Te tryby są w mocy tylko w przypadku wykonywania zapytania, dla którego są ustawione. Nie wpływają one na wyniki żadnych kolejnych zapytań.

FOR XML nie jest prawidłowy dla żadnego zaznaczenia, który jest używany z klauzulą FOR BROWSE .

Przykłady

Poniższa SELECT instrukcja pobiera informacje z Sales.Customer tabel i Sales.SalesOrderHeader w AdventureWorks2025 bazie danych. To zapytanie określa AUTO tryb w klauzuli FOR XML :

USE AdventureWorks2022;
GO

SELECT Cust.CustomerID,
    OrderHeader.CustomerID,
    OrderHeader.SalesOrderID,
    OrderHeader.STATUS
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader OrderHeader
    ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;

Klauzula FOR XML i nazwy serwerów

SELECT Gdy instrukcja z klauzulą FOR XML określa czteroczęściową nazwę w zapytaniu, nazwa serwera nie jest zwracana w wynikowym dokumencie XML podczas wykonywania zapytania na komputerze lokalnym. Jednak nazwa serwera jest zwracana jako czteroczęściowa nazwa, gdy zapytanie jest wykonywane na serwerze sieciowym.

Rozważmy na przykład następujące zapytanie:

SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2022.Person.Person
FOR XML AUTO;

Serwer lokalny: Gdy ServerName jest serwerem lokalnym, zapytanie zwraca następujący tekst:

<AdventureWorks2022.Person.Person LastName="Achong" />

Serwer sieciowy: Gdy ServerName jest serwerem sieciowym, zapytanie zwraca następujący tekst:

<ServerName.AdventureWorks2022.Person.Person LastName="Achong" />

Unikaj niejednoznaczności: Tę potencjalną niejednoznaczność można uniknąć, określając ten alias:

SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2022.Person.Person x
FOR XML AUTO;

Teraz zapytanie niejednoznaczne zwraca następujący tekst:

<x LastName="Achong"/>