Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Zgodnie z opisem w artykule Konstruowanie XML za pomocą FOR XML, tryby RAW i AUTO nie zapewniają dużej kontroli nad strukturą kodu XML tworzonego na podstawie wyniku zapytania. Jednak tryb JAWNy zapewnia największą elastyczność generowania kodu XML, który ma zostać wygenerowany na podstawie wyniku zapytania.
Zapytanie trybu JAWNego musi być napisane w określony sposób, aby dodatkowe informacje o wymaganym XML, takie jak oczekiwane zagnieżdżanie w XML, zostały jawnie określone jako część zapytania. W zależności od żądanego kodu XML pisanie zapytań w trybie JAWNym może być kłopotliwe. Może się okazać, że używanie trybu PATH z użyciem zagnieżdżania jest prostszą alternatywą dla pisania zapytań w trybie EXPLICIT.
Ponieważ opisujesz żądany XML jako część zapytania w trybie JAWNYM, musisz upewnić się, że wygenerowany XML jest poprawnie sformułowany i prawidłowy.
Przetwarzanie zestawu wierszy w trybie EXPLICIT
Tryb JAWNy przekształca zestaw wierszy, który wynika z wykonania zapytania do dokumentu XML. Aby tryb JAWNY tworzył dokument XML, zbiór wierszy musi mieć określony format. Wymaga to zapisania zapytania SELECT w celu utworzenia zestawu wierszy, uniwersalnej tabeli z określonym formatem, aby logika przetwarzania mogła następnie wygenerować odpowiedni kod XML.
Najpierw zapytanie musi utworzyć następujące dwie kolumny metadanych:
Pierwsza kolumna musi podać numer tagu, typ liczby całkowitej bieżącego elementu, a nazwa kolumny musi mieć wartość Tag. Zapytanie musi podać unikatowy numer tagu dla każdego elementu, który zostanie skonstruowany z zestawu wierszy.
Druga kolumna musi podać numer tagu elementu nadrzędnego, a nazwa tej kolumny musi być nadrzędna. W ten sposób Tag i kolumna nadrzędna zawierają informacje o hierarchii.
Te wartości kolumn metadanych wraz z informacjami w nazwach kolumn są używane do tworzenia żądanego kodu XML. Zapytanie musi podać nazwy kolumn w określony sposób. Należy również zauważyć, że wartość 0 lub NULL w kolumnie Nadrzędna wskazuje, że odpowiedni element nie ma elementu nadrzędnego. Element jest dodawany do kodu XML jako element najwyższego poziomu.
Aby zrozumieć, jak uniwersalna tabela wygenerowana przez zapytanie jest przetwarzana do generowania wyniku XML, załóżmy, że utworzono zapytanie tworzące tę uniwersalną tabelę:
Zwróć uwagę na następującą tabelę uniwersalną:
Dwie pierwsze kolumny to Tag i Parent i są kolumnami meta. Te wartości określają hierarchię.
Nazwy kolumn są określone w określony sposób, zgodnie z opisem w dalszej części tego artykułu.
Podczas generowania kodu XML z tej uniwersalnej tabeli dane w tej tabeli są partycjonowane w pionie w grupach kolumn. Grupowanie jest określane na podstawie wartości Tag i nazw kolumn. W konstruowaniu kodu XML logika przetwarzania wybiera jedną grupę kolumn dla każdego wiersza i konstruuje element. W tym przykładzie stosuje się następujące kwestie:
W polu Wartość kolumny Tag 1 w pierwszym wierszu kolumny, których nazwy zawierają ten sam numer tagu, Customer!1!cid i Customer!1!name, tworzą grupę. Te kolumny są używane podczas przetwarzania wiersza i można zauważyć, że kształt wygenerowanego elementu to
<Customer id=... name=...>. Format nazwy kolumny został opisany w dalszej części tego artykułu.W przypadku wierszy, gdzie wartość w kolumnie Tag wynosi 2, kolumny Order!2!id oraz Order!2!date tworzą grupę, która jest następnie używana do konstruowania elementów
<Order id=... date=... />.W przypadku wierszy, w których wartość kolumny Tag wynosi 3, kolumny OrderDetail!3!id!id i OrderDetail!3!pid!idref tworzą grupę. Każdy z tych wierszy generuje element ,
<OrderDetail id=... pid=...>na podstawie tych kolumn.
Podczas generowania hierarchii XML wiersze są przetwarzane w kolejności. Hierarchia XML jest określana w następujący sposób:
Pierwszy wiersz określa wartość Tag 1 i wartość Parent NULL. W związku z tym odpowiedni element,
<Customer>element, jest dodawany jako element najwyższego poziomu w kodzie XML.<Customer cid="C1" name="Janine">Drugi wiersz identyfikuje wartość tagu 2 i wartość nadrzędnej 1. W związku z tym element,
<Order>element, jest dodawany jako element podrzędny<Customer>elementu.<Customer cid="C1" name="Janine"> <Order id="O1" date="1/20/1996">Dwa następne wiersze identyfikują wartość tag 3 i wartość nadrzędna 2. W związku z tym, dwa elementy typu
<OrderDetail>są dodawane jako podrzędne elementy elementu<Order>.<Customer cid="C1" name="Janine"> <Order id="O1" date="1/20/1996"> <OrderDetail id="OD1" pid="P1"/> <OrderDetail id="OD2" pid="P2"/>Ostatni wiersz identyfikuje 2 jako numer tagu i 1 jako numer tagu nadrzędnego . W związku z tym do elementu nadrzędnego
<Customer>jest dodawany inny element podrzędny<Order>.<Customer cid="C1" name="Janine"> <Order id="O1" date="1/20/1996"> <OrderDetail id="OD1" pid="P1"/> <OrderDetail id="OD2" pid="P2"/> </Order> <Order id="O2" date="3/29/1997"> </Customer>
Podsumowując, wartości w kolumnach meta Tag i Parent, informacje podane w nazwach kolumn oraz prawidłowa kolejność wierszy tworzą pożądany XML, gdy używany jest tryb JAWNY (EXPLICIT).
Porządkowanie wierszy tabeli uniwersalnej
Podczas konstruowania kodu XML wiersze w tabeli uniwersalnej są przetwarzane w kolejności. W związku z tym, aby pobrać prawidłowe wystąpienia podrzędne skojarzone z ich elementem nadrzędnym, wiersze w zestawie wierszy muszą być uporządkowane tak, aby każdy węzeł nadrzędny był natychmiast obserwowany przez jego elementy podrzędne.
Określanie nazw kolumn w tabeli uniwersalnej
Podczas pisania zapytań w trybie JAWNYM nazwy kolumn w wynikowym zestawie wierszy muszą być określone przy użyciu tego formatu. Udostępniają one informacje o transformacji, w tym nazwy elementów i atrybutów oraz inne dodatkowe informacje określone za pomocą dyrektyw.
Jest to ogólny format:
ElementName!TagNumber!AttributeName!Directive
Poniżej przedstawiono opis części formatu.
ElementName
Wynikowy ogólny identyfikator elementu. Jeśli na przykład klienci są określeni jako ElementName, element
<Customers>zostanie wygenerowany.Numer tagu
Unikatowa wartość tagu przypisana do elementu. Ta wartość, z pomocą dwóch kolumn metadanych, Tag i Parent, określa zagnieżdżanie elementów w wynikowym kodzie XML.
Nazwa atrybutu
Zawiera nazwę atrybutu, który ma być skonstruowany w określonym ElementName. Jest to zachowanie, jeśli nie określono dyrektywy .
Jeśli określono dyrektywę i jest to xml, cdata lub element, ta wartość jest używana do konstruowania elementu podrzędnego elementu ElementName, a wartość kolumny jest dodawana do niej.
Jeśli określisz dyrektywę, atrybut AttributeName może być pusty. Na przykład ElementName!TagNumber!!Dyrektywa. W takim przypadku wartość kolumny jest bezpośrednio zawarta w elemecie ElementName.
Dyrektywa
Dyrektywa jest opcjonalna i można jej użyć do udostępnienia dodatkowych informacji dotyczących budowy kodu XML. Dyrektywa ma dwa cele.
Jednym z celów jest kodowanie wartości jako ID, IDREF i IDREFS. Słowa kluczowe ID, IDREF i IDREFS można określić jako dyrektywy. Te dyrektywy zastępują typy atrybutów. Umożliwia to tworzenie łączy wewnątrz dokumentów.
Ponadto możesz użyć dyrektywy, aby wskazać, jak mapować dane ciągu na XML. Słowa kluczowe hide, element, elementxsinil, xml, xmltext i cdata mogą być używane jako dyrektywa. Dyrektywa hide ukrywa węzeł. Jest to przydatne, gdy pobierasz wartości tylko do celów sortowania, ale nie chcesz ich w wynikowym kodzie XML.
Dyrektywa elementu generuje zawarty element zamiast atrybutu. Zawarte dane są kodowane jako jednostka. Na przykład znak < staje się znakiem <. W przypadku wartości kolumn null nie jest generowany żaden element. Jeśli chcesz, aby wygenerowano element dla pustych wartości kolumn, możesz użyć dyrektywy elementxsinil. Spowoduje to wygenerowanie elementu, który ma atrybut xsi:nil=TRUE.
Dyrektywa XML jest taka sama jak dyrektywa elementu , z tą różnicą, że nie występuje kodowanie jednostek. Dyrektywę element można połączyć z ID, IDREF lub IDREFS, podczas gdy dyrektywa xml nie jest dozwolona z żadną inną dyrektywą, z wyjątkiem przypadku użycia z dyrektywą hide.
Dyrektywa cdata zawiera dane, opakowując je w sekcję CDATA. Zawartość nie jest kodowana jako encje. Oryginalny typ danych musi być typem tekstowym, takim jak varchar, nvarchar, text lub ntext. Ta dyrektywa może być używana tylko z ukrywanie. W przypadku użycia tej dyrektywy atrybut AttributeName nie może być określony.
Łączenie dyrektyw między tymi dwiema grupami jest dozwolone w większości przypadków, ale łączenie ich między sobą nie jest dozwolone.
Jeśli nie określono Directive i AttributeName, na przykład Customer!1, dyrektywa elementu jest implikowana, na przykład Customer!1!!element, a dane kolumny są zawarte w elemencie ElementName.
Jeśli określono dyrektywę xmltext , zawartość kolumny jest owinięta w jednym tagu zintegrowanym z resztą dokumentu. Ta dyrektywa jest przydatna do pobierania nadmiaru, niezużytych danych XML przechowywanych w kolumnie za pomocą OPENXML. Aby uzyskać więcej informacji, zobacz OPENXML (SQL Server).
Jeśli określono atrybut AttributeName , nazwa tagu jest zastępowana przez określoną nazwę. W przeciwnym razie atrybut jest dołączany do bieżącej listy atrybutów elementów otaczających przez umieszczenie zawartości na początku elementu zawierającego bez kodowania encji. Kolumna z tą dyrektywą musi być typem tekstowym, takim jak varchar, nvarchar, char, nchar, text lub ntext. Ta dyrektywa może być używana tylko z ukrywanie. Dyrektywa ta jest przydatna w pobieraniu danych nadmiarowych przechowywanych w kolumnie. Jeśli zawartość nie jest poprawnie sformułowanym kodem XML, zachowanie jest niezdefiniowane.
Dalsze kroki
W poniższych przykładach pokazano użycie trybu JAWNE.
- Przykład: pobieranie informacji o pracownikach
- Przykład: określanie dyrektywy ELEMENT
- Przykład: określenie dyrektywy ELEMENTXSINIL
- Przykład: konstruowanie elementów pokrewnych w Trybie EXPLICIT
- Przykład: Specyfikacja dyrektyw ID oraz IDREF
- Przykład: określanie dyrektyw ID i IDREFS
- Przykład: określanie dyrektywy HIDE
- Przykład: określanie dyrektywy ELEMENT i kodowania jednostek
- Przykład: określanie dyrektywy CDATA
- Przykład: określanie dyrektywy XMLTEXT