nodes() metoda (xml typ danych)
Nodes() metoda jest przydatna, gdy shred xml typu danych wystąpienie relacyjnymi bazami danych. Umożliwia to określenie węzłów, które będą mapowane do nowego wiersza.
Każdy xml ma typu danych wystąpienie węzła niejawnie podanego kontekstu.XML wystąpienie przechowywane w kolumna lub zmiennej to jest węzeł dokumentu.Węzeł dokumentu jest niejawny węzła w górnej części każdej xml wystąpienietypu danych.
Wynik nodes() metoda jest logiczną kopii oryginalnego wystąpienia XML zawiera zestaw wierszy .W te kopie logiczne węzeł kontekstu każdego wiersza wystąpienie jest zestaw jeden z węzłów identyfikowane z kwerendy wyrażenietak, aby kolejne kwerendy można nawigować względem tych węzłów kontekstu.
Można pobrać wiele wartości z zestaw wierszy.Na przykład, można zastosować value() zestaw wierszy zwracanych przezmetoda nodes() i pobrać z oryginalnej XML wystąpieniewielu wartości. Należy zauważyć, że value() metoda, po zastosowaniu XML wystąpieniezwraca tylko jedną wartość.
Składnia
nodes (XQuery) as Table(Column)
Argumenty
XQuery
To ciąg literału, XQuery wyrażenie.Jeśli wyrażenie kwerendy konstrukcje węzłów, węzły te zbudowane są eksponowane w wynikowym zestaw wierszy.Jeśliwyniki wyrażeniekwerendy w sekwencji pustych zestaw wierszy będzie pusta. Jeśli wyrażenie kwerendy statycznie wyniki w kolejności, która zawiera niepodzielny wartości zamiast węzłów, spowodował błąd statyczne.Table(Column)
Jest nazwa tabela i nazwę kolumna dla wynikowego zestaw wierszy.
Uwagi
Na przykład przyjmijmy mają w poniższej tabela:
T (ProductModelID int, Instructions xml)
Poniższe instrukcje wytwarzania, dokument jest przechowywany w tabela.Jest wyświetlany tylko fragmentu.Należy zauważyć, że istnieją trzy miejsca wytwarzania w dokumencie.
<root>
<Location LocationID="10"...>
<step>...</step>
<step>...</step>
...
</Location>
<Location LocationID="20" ...>
...
</Location>
<Location LocationID="30" ...>
...
</Location>
</root>
A nodes()wywołaniametoda z kwerendy wyrażenie /root/Location zwróci zestaw wierszy z trzech wierszy, każda zawierająca logiczne kopii oryginalnego dokumentu XML i z kontekstu elementzestaw 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 Typ danych metod.Następująca kwerenda wyodrębnia poddrzewa kontekstu element dla każdego wiersza generowane:
SELECT T2.Loc.query('.')
FROM T
CROSS APPLY Instructions.nodes('/root/Location') as T2(Loc)
Jest to wynikiem:
ProductModelID Instructions
----------------------------------
1 <Location LocationID="10" ... />
1 <Location LocationID="20" ... />
1 <Location LocationID="30" .../>
Należy zauważyć, że zwracany zestaw wierszy ma zachowane informacje o typie.Można zastosować xml danych typu metod, takich jak query(), value(), exist(), i nodes(), wynikiem nodes() metoda.Nie można jednak zastosować modify() metoda , aby zmodyfikować XML wystąpienie.
Ponadto nie można materialized węzeł kontekstu w zestaw wierszy .Oznacza to, że nie można go używać w instrukcjaSELECT.Jednak można go użyć w IS NULL i COUNT(*).
Scenariusze korzystania z nodes() metoda są takie same dla za pomocą OPENXML (Transact-SQL).Zawiera zestaw wierszy Widok XML.Jednakże, nie trzeba używać kursory, korzystając z nodes() metoda w tabela , która zawiera kilka wierszy dokumentów XML.
Należy zauważyć, że zestaw wierszy zwracanych przez nodes() metoda jest bez nazwy zestaw wierszy.Dlatego też musi jawnie nazywać za pomocą wygładzania.
**Nodes()**nie można zastosowaćfunkcja bezpośrednio do wyniki zdefiniowanej przez użytkownika funkcja. Aby użyć nodes() funkcja wartość skalarna zdefiniowanej przez użytkownika funkcjabędące wynikiem można przypisać wynik zdefiniowanej przez użytkownika funkcja zmiennej lub użyć tabela pochodnej przypisać kolumna alias do wartości zwracanej przez użytkownika funkcja , a następnie użycie granic dotyczą wybierz alias.
W poniższym przykładzie przedstawiono sposób użycia CROSS APPLY Zaznacz od wyniku zdefiniowanej przez użytkownika funkcja.
USE AdventureWorks2008R2;
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
Nodes() metoda przeciwko zmiennej typu xml
W poniższym przykładzie jest dokument XML, który ma <Root> górnypoziom elementów i trzy <row>elementówpodrzędność . W kwerendzie użyto nodes() metoda do zestaw węzłów oddzielny kontekst, jeden dla każdego <row> elementu.nodes(),metoda zwraca zestaw wierszy z trzech wierszy. Każdy wiersz ma logiczne kopię oryginalnego pliku XML z każdego węzła kontekstowego identyfikacji różnych <row> element w oryginalnym dokumencie.
Kwerenda zwraca węzła kontekstowego z każdego wiersza:
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
To jest wynikiem.W tym przykładzie kwerendy metoda zwraca kontekstu element i jego zawartości:
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3"/>
Stosowanie nadrzędnego metoda dostępu na węzłach kontekście zwraca <Root> elementu wszystkie trzy:
SELECT T.c.query('..') AS result
FROM @x.nodes('/Root/row') T(c);
go
Jest to wynikiem:
<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 nodes() metoda wobec kolumna typu xml
Instrukcje dotyczące produkcji rowerów są używane w tym przykładzie i są przechowywane w instrukcjach xml typ kolumna z ProductModel tabela.Aby uzyskać więcej informacji, zobacz XML reprezentacji typu danych w bazie danych AdventureWorks2008R2.
W poniższym przykładzie nodes()określićmetoda przeciwko Instructionskolumna xml należy wpisać w ProductModeltabela.
nodes()Ustawiametoda <Location> elementy jako węzły kontekstu, określając /MI:root/MI:Locationścieżka. Wynikowy zestaw wierszy zawiera logiczną kopii oryginalnego dokumentu, jeden dla każdego <Location> węzła w dokumencie z kontekstu węzła zestaw do <Location> element.W związku z tym nodes()dajefunkcja zestaw <Location> kontekstu węzłów.
query()metoda przeciwko ten zestaw wierszy żąda self::node i dlatego zwraca <Location> elementu w każdym wierszu.
W tym przykładzie kwerendy ustawia poszczególne <Location> element jako węzeł kontekstu w instrukcjach wytwarzania dokumentu określonego modelu produktu.Za pomocą tych węzłów kontekst do pobierania wartości, takie jak:
Znajdź w każdej lokalizacji identyfikatorów<Location>
Pobrać czynności produkcyjnych (<step> elementówpodrzędność ) w każdym <Location>
Ta kwerenda zwraca kontekstu element, w którym skróconej składni '.' dla self::node() jest określona w query() metoda.
Uwaga:
nodes()metoda stosowane do instrukcji kolumna i zwraca zestaw wierszy, T (C).Ten zestaw wierszy zawiera logiczną kopiami oryginałów instrukcje wytwarzania dokument z /root/Location jako elementkontekstu.
Między DOMENAMI Zastosuj stosuje się nodes() dla każdego wiersza w Instructions tabela i zwraca tylko wiersze, które produkują, 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=7Jest częściowo wynikiem:
<MI:Location LocationID="10" ...> <MI:step ... /> ... </MI:Location> <MI:Location LocationID="20" ... > <MI:step ... /> ... </MI:Location> ...
Stosowanie nodes() do zestaw wierszy zwracanych przez innego nodes() metoda
Poniższy kod sprawdza dokumenty XML instrukcje produkcji w Instructions kolumna ProductModel tabela.Kwerenda zwraca zawiera identyfikator modelu produktu, miejsc wytwarzania i czynności wytwarzania zestaw wierszy .
Uwaga:
nodes()Stosowana jestmetoda Instructionskolumna i zwraca T1 (Locations)zestaw wierszy. Ten zestaw wierszy zawiera logiczną kopiami oryginałów wytwarzania instrukcje dokumentu z /root/Location element jako element kontekstu.
nodes()jest stosowany do T1 (Locations) zestaw wierszy i zwraca T2 (steps) zestaw wierszy.Ten zestaw wierszy zawiera logiczną kopiami oryginałów wytwarzania instrukcje dokumentu z /root/Location/step element jako element kontekstu.
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
Jest to wynikiem:
ProductModelID LocID Step
----------------------------
7 10 <step ... />
7 10 <step ... />
...
7 20 <step ... />
7 20 <step ... />
7 20 <step ... />
...
Kwerenda deklaruje MI Prefiks dwa razy.Zamiast tego można użyć WITH XMLNAMESPACES do deklarowania jeden prefiks czas i użyć 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
Zobacz także