Aracılığıyla paylaş


Nodes() Yöntem (xml veri türü)

The nodes() yöntem is useful when you want to shred an xml data type örnek into relational data. Yeni bir satır eşlenen düğümlerin belirlemenizi sağlar.

Her xml veri türü örnek bir örtülü olarak sağlanan içerik düğümü vardır. Bir sütun veya değişken depolanan XML örnek için belge düğümü budur.Örtülü düğümün en üstünde belge düğümdür her xml Veri örnek yazın.

Sonucu Nodes() yöntem özgün XML örneklerinin mantıksal bir kopyasını içeren bir satır olur.Bu mantıksal bir kopya, her Satır örneğinin içerik düğümü sorgusu ile tanımlanan düğümlerden küme ifade, böylece sonraki sorgular, bu içerik düğümlerin göre gidebilirsiniz.

Birden çok değer satır kümesi ' elde edebilirsiniz.Örneğin, geçerli Value() tarafından döndürülen satır kümesi kümesi kümesine yöntemNodes() ve birden çok değer özgün XML'DEN örnek.Dikkat Value() yöntem XML örneğine uygulandığında, yalnızca bir değer döndürür.

nodes (XQuery) as Table(Column)

Bağımsız değişkenler

  • XQuery
    Dize, XQuery ifade belirtilir.Sorgu ifadesi düğümlerin yapıları, oluşturulan bu düğümler sonuç kullanýma sunulan satır kümesi.Sorguyu ifade boş bir sıra sonuçlarda satır kümesi boş olacaktır.Sorguyu ifade statik olarak sonuçları düğümlerin yerine atomik değerleri içeren bir sıra statik bir hata ortaya çıkar.

  • Table(Column)
    Sonuç kümesi için tablo adını ve sütun adıdır.

Remarks

Örnek olarak, aşağıdaki sahip olduğunuz varsayılmıştır tablo:

T (ProductModelID int, Instructions xml)

Aşağıdaki tabloda depolanan belge üretim yönergeleri.Yalnızca bir parçası gösterilmiştir.Belgede üç üretim konumlara da olduğunu unutmayın.

<root>
  <Location LocationID="10"...>
     <step>...</step>
     <step>...</step>
      ...
  </Location>
  <Location LocationID="20" ...>
       ...
  </Location>
  <Location LocationID="30" ...>
       ...
  </Location>
</root>

C nodes() sorgu ifadesi ile Yöntem çağırma /root/Location bir satır döndürür küme özgün XML belgesini mantıksal bir kopyasını içeren her üç satır ve içerik maddenin küme birine <Location> düğümlerin:

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>

Bu satır kümesi kullanarak sonra sorgulayabilir xml Veri, yöntem türü. Aşağıdaki sorgu alt ağaçta içeriğinin ayıklayan öğe oluşturulan her satır için:

SELECT T2.Loc.query('.')
FROM   T
CROSS APPLY Instructions.nodes('/root/Location') as T2(Loc) 

Bu sonucu oluşur:

ProductModelID  Instructions
----------------------------------
1        <Location LocationID="10" ... />
1        <Location LocationID="20" ... />
1        <Location LocationID="30" .../>

Döndürülen satır kümesi kümesi türü bilgileri tutulan olmadığını unutmayın.Uygulayabileceğiniz xml veri yöntemleri gibi yazın... Query(), Value(), EXIST(), and Nodes() sonucunuNodes() yöntem.Ancak, uygulanamıyor MODIFY() yöntem XML örnek olarak değiştirilecek.

Ayrıca, satır kümesi kümesi içerik düğümünde materialized edemiyor.Diğer bir deyişle, bir SELECT deyiminde kullanamazsınız.Ancak, bunu IS NULL ve COUNT(*) kullanabilirsiniz.

Kullanma senaryoları Nodes() yöntem aynı olarak kullanmaOPENXML (Transact-SQL). Bu, bir satır kümesi XML görünümünü sağlar.Ancak, imleçler kullandığınızda gerekmez Nodes() yöntem, XML belgelerinin birden fazla satır içeren bir tablo.

Satır kümesi tarafından döndürülen Not Nodes() adlandırılmamış bir satır kümesi yöntemidir.Bu nedenle, açıkça yumuşatma kullanarak adlandırılmalıdır.

The nodes() işlev cannot be applied directly to the sonuçlar of a user-defined işlev.Kullanılacak Nodes() işlevi skaler kullanıcı tanımlı bir işlev sonucunda bir değişkene kullanıcı tanımlı işlevin sonucu atamak veya bir sütun diğer ad ad adı kullanıcı tanımlı işlevin sonuç değeri olarak atamak ve çapraz diğer ad ad APPLY'ı kullanmak için bir türetilmiş bir tablo kullanın.

Aşağıdaki örnek, kullanılacak bir yolu gösterir. CROSS APPLY Kullanıcı tanımlı fonksiyonun sonuç seçmek için .

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

Örnekler

Xml türünde bir değişken karşı Nodes() yöntem kullanarak

Aşağıdaki örnekte olduğu bir XML belgesi yok bir <Root> en üst düzey öğe ve üç <row> Alt Öğeler. Sorguyu kullanan nodes() ayrı bir içerik düğümlerin her biri için bir yöntem <row> Öğe. The nodes() yöntem returns a satır kümesi with three rows. Her satır özgün XML, mantıksal bir kopyasını farklı bir tanımlama her içerik düğümü vardır. <row> özgün belgedeki öğe.

Sorgu, her satırdan sonra içerik düğümü 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

Aşağıdaki sonucudur.Bu örnekte, sorgu yöntem, içerik maddeyi ve 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"/>

Içerik düğümlerde üst erişimci uygulama işlevi <Root> üçü için öğe:

SELECT T.c.query('..') AS result
FROM   @x.nodes('/Root/row') T(c)
go

Bu sonucu oluşur:

<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>

Xml türünde bir sütuna göre nodes() yöntem belirtme

Bisiklet üretim yönergeleri yönergeleri depolanır ve bu örnekte kullanılan xml Tür sütun ProductModel tablo.Daha fazla bilgi için bkz:XML veri türü temsili AdventureWorks veritabanındaki.

Aşağıdaki örnekte, nodes() yöntem karşı belirtilen Instructions sütun xml yazın ProductModel TABLO.

The nodes() yöntem sets the <Location> elements as context nodes by specifying the /MI:root/MI:Location yol. Sonuçta elde edilen satır küme özgün belge, her bir mantıksal bir kopyasını içerir. <Location> içerik düğümü belgedeki düğümüyle küme için <Location> Öğe. Bu nedenle, nodes() verir işlev bir küme, <Location> içerik düğümlerin.

The query() yöntem against this satır kümesi requests self::node and, therefore, returns the <Location> element in each row.

Bu örnekte, her sorgu ayarlar <Location> öğe bir üretim yönergelerinde içerik düğümü olarak belirli bir ürün modeline bir belgenin. Bu içerik düğümlerin, aşağıdaki gibi değerleri almak için kullanabilirsiniz:

  • Find Location IDs in each <Location>

  • Retrieve manufacturing steps (<step> child elements) in each <Location>

Bu sorgu, içerik döndürür öğe, kısaltılmış sözdizimi '.' için self::node() , içinde belirtilen query() yöntem.

Şunları unutmayın:

  • The nodes() yöntem is applied to the Instructions sütun and returns a satır kümesi, T (C). Bu satır kümesi kümesi, özgün mantıksal kopyalarını içeren ile üretim yönergeleri belge /root/Location içerik maddenin.

  • APPLY uygulanır. nodes() Her satır için Instructions Tablo ve yalnızca bir sonuç kümesi üreten 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 kaynaklanır:

    <MI:Location LocationID="10"  ...>
       <MI:step ... />
          ...
    </MI:Location>
    <MI:Location LocationID="20"  ... >
        <MI:step ... />
          ...
    </MI:Location>
    ...
    

Başka bir nodes() yöntem tarafından döndürülen satır kümesi kümesi kümesine Nodes() uygulama

Aşağıdaki kod, XML belgelerinin üretim yönergelerinde için sorgular Instructions sütun ProductModel TABLO. Sorgu, ürün modeli KIMLIĞI, üretim konumları ve üretim adımları içeren satır kümesi kümesi döndürür.

Şunları unutmayın:

  • The nodes() yöntem is applied to the Instructions sütun and returns the T1 (Locations) satır kümesi. Bu satır kümesi kümesi, özgün mantıksal kopyalarını içeren ile yönergeleri belge, üretim /root/Location öğe kapsamı olarak öğesi.

  • nodes() uygulanan T1 (Locations) satır kümesi ve T2 (steps) satır kümesi. Bu satır kümesi kümesi, özgün mantıksal kopyalarını içeren ile yönergeleri belge, üretim /root/Location/step öğe kapsamı olarak öğesi.

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 oluşur:

ProductModelID LocID Step       
----------------------------       
7      10   <step ... />       
7      10   <step ... />       
...       
7      20   <step ... />       
7      20   <step ... />       
7      20   <step ... />       
...       

Sorgu bildirir MI iki kez öneki. Bunun yerine kullanın WITH XMLNAMESPACES saat önek 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