nodes() metoda (typ danych xml)
Metoda nodes() jest przydatna, jeśli wystąpienie typu danych xml ma zostać zamienione na dane relacyjne.Pozwala to określić węzły, które będą mapowane na nowy wiersz.
Co xml wystąpienie typu danych ma węzłowi niejawnie podanego kontekstu. Nazwa bazy danych, który zawiera klucz.Węzeł dokumentu jest niejawna węzła w górnej części każdej xml wystąpienie typu danych.
Wynik nodes() metodą jest zestaw wierszy, zawierający logiczną kopii oryginalnego wystąpienia XML.Ten identyfikator jest unikatowy w obrębie bazy danych.
key_nameNa przykład, można zastosować Value() Metoda zestawu zestaw wierszy zwracanych przez nodes() i pobrać wiele wartości z oryginalnego wystąpienie XML.Należy zauważyć, że Value() metoda, po zastosowaniu do obiektu XML zwraca tylko jedną wartość.
nodes (XQuery) as Table(Column)
Argumenty
XQuery
key_guidIdentyfikator GUID klucz.opened_dateData i Godzina otwarcia klucz.Table(Column)
1, jeśli klucz jest prawidłowy metadane.
Remarks
0, jeśli klawisz nie zostanie znaleziony metadane.
T (ProductModelID int, Instructions xml)
Poniższy dokument instrukcji produkcyjnej jest przechowywany w tabeli.Pokazano tylko jego fragment.Należy zwrócić uwagę, że w dokumencie występują trzy lokalizacje produkcji.
<root>
<Location LocationID="10"...>
<step>...</step>
<step>...</step>
...
</Location>
<Location LocationID="20" ...>
...
</Location>
<Location LocationID="30" ...>
...
</Location>
</root>
A nodes() wywołania metoda w wyrażeniu kwerendy /root/Location zwróciłby zestaw wierszy z trzema wierszami, każdy zawierający logiczną kopii oryginalnego dokumentu XML, a elementem kontekstu ustawić jedną z <Location> węzły:
Product
ModelID Instructions
----------------------------------
1 <root>
<Location LocationID="20" ... />
<Location LocationID="30" .../></root>
1 <root><Location LocationID="10" ... />
<Location LocationID="30" .../></root>
1 <root><Location LocationID="10" ... />
<Location LocationID="20" ... />
</root>
Ten zestaw wierszy można następnie kwerendy przy użyciu xml metody typu danych. Ustawienie zestaw ARITHABORT może służyć do określenia, czy kwerenda zostanie zakończona.
SELECT T2.Loc.query('.')
FROM T
CROSS APPLY Instructions.nodes('/root/Location') as T2(Loc)
Oto wynik:
ProductModelID Instructions
----------------------------------
1 <Location LocationID="10" ... />
1 <Location LocationID="20" ... />
1 <Location LocationID="30" .../>
To ustawienie nie ma wpływu na błędów występujących podczas INSERT, UPDATE i DELETE instrukcji.Można zastosować xml takie jak metoda, typ danych Query(), Value(), EXIST(), and nodes(), do wyniku nodes() metoda.Nie można jednak zastosować Modify() metoda, aby zmodyfikować plik XML wystąpienie.
Ponadto węzeł kontekstu w zestawie wierszy nie może zostać zmaterializowany.Oznacza to, że nie można użyć instrukcji SELECT.Można jednak użyć jej w instrukcjach IS NULL i COUNT(*).
Scenariusze użycia metody nodes() są takie same jak scenariusze użycia instrukcji OPENXML (Transact-SQL).Dzięki temu jest dostępny widok zestawu wierszy kodu XML.Jednak kursorów nie trzeba używać w przypadku użycia metody nodes() w odniesieniu do tabeli zawierającej kilka wierszy dokumentów XML.
Należy zwrócić uwagę, że zestaw wierszy zwrócony przez metodę nodes() nie ma nazwy.Dlatego należy jawnie nadać mu nazwę przy użyciu aliasowania.
Funkcji nodes() nie można zastosować bezpośrednio do wyników funkcji zdefiniowanej przez użytkownika.Aby użyć funkcji nodes() z wynikiem funkcji skalarnej zdefiniowanej przez użytkownika, można przypisać ten wynik do zmiennej lub użyć tabeli pochodnej w celu przypisania aliasu kolumny do wartości zwracanej funkcji zdefiniowanej przez użytkownika, a następnie użyć instrukcji CROSS APPLY w celu dokonania wyboru na podstawie aliasu.
W poniższym przykładzie pokazano jeden sposób użycia instrukcji CROSS APPLY w celu dokonania wyboru z wyniku funkcji zdefiniowanej przez użytkownika.
USE AdventureWorks;
GO
CREATE FUNCTION XTest()
RETURNS xml
AS
BEGIN
RETURN '<document/>';
END;
GO
SELECT A2.B.query('.')
FROM
(SELECT dbo.XTest()) AS A1(X)
CROSS APPLY X.nodes('.') A2(B);
GO
DROP FUNCTION XTest;
GO
Przykłady
Użycie metody nodes() w odniesieniu do zmiennej typu xml
W poniższym przykładzie występuje dokument XML zawierający element najwyższego poziomu <Root> i trzy elementy podrzędne <row>.W kwerendzie jest używana metoda nodes() w celu ustawienia osobnych węzłów kontekstu, jednego dla każdego elementu <row>.Metoda nodes() zwraca zestaw wierszy składający się z trzech wierszy.Każdy wiersz zawiera logiczną kopię oryginalnego kodu XML, przy czym każdy węzeł kontekstu określa inny element <row> dokumentu oryginalnego.
Kwerenda zwraca następnie węzły kontekstu z poszczególnych wierszy:
DECLARE @x xml
SET @x='<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>'
SELECT T.c.query('.') AS result
FROM @x.nodes('/Root/row') T(c)
GO
Poniżej pokazano wynik.W tym przykładzie metoda query zwraca element kontekstu i jego zawartość:
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3"/>
Stosowanie metoda dostępu nadrzędnej na węzłach kontekstu zwraca <Root> element dla wszystkich trzech:
SELECT T.c.query('..') AS result
FROM @x.nodes('/Root/row') T(c)
go
Oto wynik:
<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>
<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>
<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>
Określanie metody nodes() w odniesieniu do kolumny typu xml
Instrukcje produkcji roweru są używane w tym przykładzie i są przechowywane w instrukcji xml Kolumna typu ProductModel tabela.Aby uzyskać więcej informacji zobaczxml Data Type Representation in the AdventureWorks Database.
W poniższym przykładzie nodes() Metoda jest określona względem Instructions kolumna xml Wpisz w polu ProductModel Tabela.
The nodes() metoda sets the <Location> elements as context nodes by specifying the /MI:root/MI:Location ścieżka. Poniższy przykład tworzy wpis, który mapuje wszystkich użytkowników na serwerze zdalnym <Location> do identyfikator logowania lokalnego <Location>. Dlatego też nodes() funkcja zwraca zestaw <Location> węzły kontekstu.
Metoda query() użyta w odniesieniu do tego zestawu wierszy żąda funkcji self::node i dlatego zwraca element <Location> w każdym wierszu.
W tym przykładzie kwerenda ustawia element <Location> jako węzeł kontekstu w dokumencie instrukcji produkcyjnej określonego modelu produktu.Tych węzłów kontekstu można użyć w celu pobrania wartości, takich jak następujące:
Find Location IDs in each <Location>
Retrieve manufacturing steps (<step> child elements) in each <Location>
Ta kwerenda zwraca element kontekstu, w którym skróconej składni '.' dla self::node() jest określony w query() Metoda.
Jeśli tworzony jest dostawca później z tego samego klucz identyfikatorów GUID, klucze ma nastąpić.
The nodes() metoda is applied to the Instructions kolumna and returns a zestaw wierszy, T (C). Ten zestaw wierszy zawiera logiczną kopii oryginalnego dokumentu instrukcje produkcji z /root/Location jako element kontekstu.
Zastosuj między DOMENAMI dotyczy nodes() do każdego wiersza w Instructions Tabela i zwraca jedynie tych wierszy, które wywołują zestaw wyników.
SELECT C.query('.') as result FROM Production.ProductModel CROSS APPLY Instructions.nodes(' declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"; /MI:root/MI:Location') as T(C) WHERE ProductModelID=7
Jeśli WARIANCJA jest używana dla wszystkich elementów w instrukcja SELECT, każda wartość zestaw wyników znajduje się w obliczeniach.
<MI:Location LocationID="10" ...> <MI:step ... /> ... </MI:Location> <MI:Location LocationID="20" ... > <MI:step ... /> ... </MI:Location> ...
Funkcja WARIANCJA mogą być używane tylko kolumny liczbowe.
W poniższym kodzie kwerendy dokumentów XML, aby uzyskać instrukcje produkcji w Instructions kolumna ProductModel Tabela. Kojarzy planu konserwacji z istniejącego zadanie.
Jeśli tworzony jest dostawca później z tego samego klucz identyfikatorów GUID, klucze ma nastąpić.
The nodes() metoda is applied to the Instructions kolumna and returns the T1 (Locations) zestaw wierszy. Ten zestaw wierszy zawiera logiczną kopii oryginału produkcji z dokumentu instrukcje /root/Location element jako element kontekst.
nodes() jest stosowany do T1 (Locations) zestaw wierszy i zwraca T2 (steps) zestaw wierszy. Ten zestaw wierszy zawiera logiczną kopii oryginału produkcji z dokumentu instrukcje /root/Location/step element jako element kontekst.
SELECT ProductModelID, Locations.value('./@LocationID','int') as LocID,
steps.query('.') as Step
FROM Production.ProductModel
CROSS APPLY Instructions.nodes('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location') as T1(Locations)
CROSS APPLY T1.Locations.nodes('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
./MI:step ') as T2(steps)
WHERE ProductModelID=7
GO
Oto wynik:
ProductModelID LocID Step
----------------------------
7 10 <step ... />
7 10 <step ... />
...
7 20 <step ... />
7 20 <step ... />
7 20 <step ... />
...
Deklaruje kwerendy MI Prefiks dwa razy. Zamiast tego można użyć WITH XMLNAMESPACES Aby zadeklarować prefiks jeden raz, a następnie używać go w kwerendzie:
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' AS MI)
SELECT ProductModelID, Locations.value('./@LocationID','int') as LocID,
steps.query('.') as Step
FROM Production.ProductModel
CROSS APPLY Instructions.nodes('
/MI:root/MI:Location') as T1(Locations)
CROSS APPLY T1.Locations.nodes('
./MI:step ') as T2(steps)
WHERE ProductModelID=7
GO