Nodes() yöntemi (xml veri türü)
Nodes() yöntem shred istediğinizde yararlı bir xml veri türü örnek ilişkisel veri. Yeni bir satıra eşlenen düğümleri tanımlamak sağlar.
Her xml veri türü örnek var. bir örtülü olarak sağlanan içerik düğümüBir sütun veya değişken depolanan xml örnek için belge düğümü budur.Belge düğümü üst kısmındaki örtülü düğümdür her xml veri türü örnek.
Sonucu **nodes()**yöntem . İzleyen sorgular bu bağlam düğüm göreli olarak gidebilirsiniz bu mantıksal kopyalar, içerik düðümünün her satır örnek sorgu ifadeile tanımlanan düğümlerden birine küme , böylece.
Birden çok değer satır kümesi' alabilirsiniz.Örneğin, geçerli value() yöntem tarafından döndürülen satır kümesi nodes() ve birden çok değer özgün xml örnekalmak.Unutmayın **value()**xml örnekuygulandığındayöntem, tek bir değer döndürür.
Sözdizimi
nodes (XQuery) as Table(Column)
Bağımsız değişkenler
XQuery
Bir dize , bir XQuery ifadeedilir.Oluşturulmuş bu düğümler düğüm sorgu ifade yapıları, sonuç satır kümesiiçinde sunulur.satır kümesi boş bir sıra sorgu ifadesonuçlar boş olursa. Sorgu ifade statik olarak sonuçlar atomik içeren bir sıra düğümler yerine, değerleri, statik bir hata ortaya çıkar.Table(Column)
Elde edilen satır kümesiiçin tablo adı ve sütun adıdır.
Açıklamalar
Örneğin, aşağıdaki tablosahip olduğunu varsayalım:
T (ProductModelID int, Instructions xml)
Aşağıdaki belge tablodepolanan üretim yönergeleri.Yalnızca bir parçası gösterilmektedir.Belge üç üretim konumlarda olduğunu unutmayın.
<root>
<Location LocationID="10"...>
<step>...</step>
<step>...</step>
...
</Location>
<Location LocationID="20" ...>
...
</Location>
<Location LocationID="30" ...>
...
</Location>
</root>
A nodes()yöntem çağırma sorgu ifadeile /root/Location Her mantıksal bir kopyasını özgün xml belgesi ile öğebağlamküme için aşağıdakilerden birini içeren üç satır içeren bir satır kümesi döndürür <Location> düğümleri:
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>
Sonra bu satır kümesi kullanarak Sorgulayabileceğiniz xml veri türü yöntemleri.Aşağıdaki sorgu oluşturulan her satır için bağlam öğe alt ağaçta ayıklar:
SELECT T2.Loc.query('.')
FROM T
CROSS APPLY Instructions.nodes('/root/Location') as T2(Loc)
Bu sonucu verir:
ProductModelID Instructions
----------------------------------
1 <Location LocationID="10" ... />
1 <Location LocationID="20" ... />
1 <Location LocationID="30" .../>
Döndürülen satır kümesi Not türü bilgileri korunur.Uygulayabileceğiniz xml veri türü yöntemleri gibi query(), value(), exist(), ve nodes(), sonucunu bir nodes() yöntem.Ancak, uygulayamazsınız **modify()**xml örnekdeğiştirmek içinyöntem .
Ayrıca, satır kümesi içinde içerik düðümünün materialized olamaz.Yani, bir select deyimolarak kullanamazsınız.Ancak, IS null ve count(*) kullanabilirsiniz.
Kullanma senaryoları nodes() yöntem kullanarak aynı olan openxml (Transact-SQL).Bu bir satır kümesi xml görünümünü sağlar.Ancak, kullandığınız imleçler kullanmak gerekmez nodes() yöntem xml belgelerinin birden çok satır içeren bir tablo .
satır kümesi tarafından döndürülen Not **nodes()**yöntem . Bu nedenle, bunu açıkça yumuşatma kullanılarak adlandırılması gerekir.
**Nodes()**işlev doğrudan sonuçlar kullanıcı tanımlı bir işleviçin uygulanamaz. Kullanmak için **nodes()**işlev skaler kullanıcı tanımlı işlevsonucu, sonucu bir değişkene kullanıcı tanımlı işlev atamak veya sonra çapraz diğer adseçmek için UYGULA'yı kullanın ve bir sütundiğer ad için kullanıcı tanımlı işlev dönüş değeri atamak için türetilmiş bir tablo kullanın.
Aşağıdaki örnek kullanmanın tek yolu gösterir CROSS APPLY bir kullanıcı tanımlı işlevsonuç seçin.
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
Örnekler
Bir xml türü değişkeni karşı Nodes() yöntem kullanarak
Aşağıdaki örnekte, yok olan bir xml belgesini bir <Root> üstdüzey öğesi ve üç <row> alt öğeleri.Sorguyu kullanır nodes() yöntem ayrı içerik düğüm küme için her biri <row> öğesi.nodes()yöntem ile üç satır satır kümesi döndürür. Her satır özgün xml mantıksal bir kopyası her içerik düðümünün farklı bir tanımlama vardır <row> özgün belgedeki öğe.
Sorgu, her satırdan sonra içerik düðümünün verir:
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
Sonuç aşağıdadır.Bu örnekte, sorgu yöntem bağlam öğe hem de içeriğini döndürür:
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3"/>
İçerik düğümlerinde üst erişimci uygulama verir <Root> üç öğe:
SELECT T.c.query('..') AS result
FROM @x.nodes('/Root/row') T(c);
go
Bu sonucu verir:
<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>
Bir xml türü sütun karşı nodes() yöntem belirtme
Bisiklet üretim yönergeleri yönergelerinde saklanır ve bu örnekte kullanılan xml sütun yazın ProductModel tablo.Daha fazla bilgi için, bkz. XML veri türü temsili AdventureWorks2008R2 veritabanında.
Aşağıdaki örnekte, nodes()karşıyöntem belirtilen Instructionssütun xml yazın ProductModeltablo.
nodes()yöntem ayarlar <Location> öğeleri belirterek bağlama düğümleri olarak /MI:root/MI:Locationyol. Mantıksal özgün belgenin kopyalarını, her sonuç satır kümesi içerir <Location> düğümü belgede bağlam düğüm küme için <Location> öğesi.Bu nedenle, nodes() işlev verir bir küme , <Location> bağlam düğüm.
query()yöntem bu satır kümesi karşı ister self::node ve bu nedenle, verir <Location> öğesi her satır.
Bu örnekte, sorgu her ayarlar <Location> öğesi bir içerik düðümünün üretim yönergeleri olarak belirli bir ürün modeline belge.Bu içerik düğümler aşağıdaki gibi değerleri almak için kullanabilirsiniz:
Her konum kimlikleri bulmak<Location>
Üretim adımları almak (<step> alt öğeler) her <Location>
Bu sorgu içerik öğeiçinde döndürür kısaltılmış sözdizimi '.' için self::node() , te belirtilen query() yöntem.
Aşağıdakilere dikkat edin:
nodes()yöntem uygulandığını yönergeleri sütun ve satır kümesidöndürür T (C).Bu satır kümesi mantıksal özgün kopyalarını içeren üretim yönergeleri belge ile /root/Location İçerik öğe.
apply geçerlidir nodes() her satıra Instructions tablo ve yalnızca bir sonuç kümesiüretmek satırları döndürür.
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
Bu kısmi bir sonucudur:
<MI:Location LocationID="10" ...> <MI:step ... /> ... </MI:Location> <MI:Location LocationID="20" ... > <MI:step ... /> ... </MI:Location> ...
Başka bir nodes() yöntemtarafından döndürülen Nodes() için satır kümesi uygulama
xml belgesi içindeki üretim yönergeleri için aşağıdaki kod sorgular Instructions sütun ProductModel tablo.Sorgu, ürün modeli kimliği, üretim konumları ve üretim adımları içeren bir satır kümesi döndürür.
Aşağıdakilere dikkat edin:
nodes()yöntem uygulanan Instructionssütun ve iade T1 (Locations)satır kümesi. Bu satır kümesi mantıksal özgün kopyalarını içeren yönergeleri belgesi ile üretim /root/Location öğesi olarak öğe içerik.
nodes()uygulanan T1 (Locations) satır kümesi ve iade T2 (steps) satır kümesi.Bu satır kümesi mantıksal özgün kopyalarını içeren yönergeleri belgesi ile üretim /root/Location/step öğesi olarak öğe içerik.
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
Bu sonucu verir:
ProductModelID LocID Step
----------------------------
7 10 <step ... />
7 10 <step ... />
...
7 20 <step ... />
7 20 <step ... />
7 20 <step ... />
...
Sorgu bildirir MI öneki iki kez.Bunun yerine kullanabileceğiniz WITH XMLNAMESPACES öneki bir saat bildirmek ve Sorguda kullanmak için:
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
Ayrıca bkz.