Aracılığıyla paylaş


nodes() Yöntemi (xml Veri Türü)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Nodes() yöntemi, xml veri tipi örneğini ilişkisel veriye parçalamak istediğinizde faydalıdır. Yeni bir satıra eşlenecek düğümleri belirlemenizi sağlar.

Her xml veri tipi örneğinin örtük olarak sağlanan bir bağlam düğümü vardır. Bir sütunda veya değişkende saklanan XML örneği için, bu düğüm belge düğümüdür. Belge düğümü, her xml veri tipi örneğinin en üstündeki örtük düğümdür.

nodes() yönteminin sonucu, orijinal XML örneklerinin mantıksal kopyalarını içeren bir satır kümesidir. Bu mantıksal kopyalarda, her satır örneğinin bağlam düğümü, sorgu ifadesiyle özdeşleştirilen düğümlerden birine ayarlanır. Bu şekilde, sonraki sorgular bu bağlam düğümlerine göre gezinebilir.

Satır kümesinden birden fazla değer alabilirsiniz. Örneğin, nodes() tarafından döndürülen satır kümesine value() yöntemini uygulayabilir ve orijinal XML örneğinden birden fazla değer alabilirsiniz. value() yöntemi, XML örneğine uygulandığında yalnızca bir değer döndürür.

Sözdizimi

nodes (XQuery) as Table(Column)  

Arguments

XQuery
Bir dize kelime harfi, XQuery ifadesidir. Sorgu ifadesi düğümler oluşturursa, bu oluşturulmuş düğümler ortaya çıkan satır kümesinde ortaya çıkar. Eğer sorgu ifadesi boş bir dizi çıkarsa, satır kümesi de boş olur. Sorgu ifadesi statik olarak düğümler yerine atomik değerler içeren bir dizi ortaya çıkarsa, statik bir hata oluşur.

Tablo(Sütun)
Tablo adı ve ortaya çıkan satır kümesi için sütun adıdır.

Açıklamalar

Örneğin, aşağıdaki tabloya sahip olduğunuzu varsayalım:

T (ProductModelID INT, Instructions XML)  

Aşağıdaki üretim talimatları belgesi tabloda saklanır. Sadece bir parça gösteriliyor. Belgede üç üretim yeri olduğunu unutmayın.

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

Sorgu ifadesiyle nodes() bir /root/Location yöntem çağırışı, her biri orijinal XML belgesinin mantıksal bir kopyasını içeren ve bağlam öğesi düğümlerden birine <Location> ayarlanmış üç satırlı bir satır kümesi döndürür:

Product  
ModelID      Instructions  
----------------------------------  
1      <root><Location LocationID="10" ... />  
             <Location LocationID="20" ... />  
             <Location LocationID="30" .../></root>  
1      <root><Location LocationID="10" ... />  
             <Location LocationID="20" ... />  
             <Location LocationID="30" .../></root>  
1      <root><Location LocationID="10" ... />  
             <Location LocationID="20" ... />  
             <Location LocationID="30" .../></root>  

Bu sıra kümesini xml veri tipi metodlarıyla sorgulayabilirsiniz. Aşağıdaki sorgu, oluşturulan her satır için bağlam öğesinin alt ağacını çıkarır:

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

İşte sonuç:

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

Geri dönen sıra kümesi tür bilgisini korudu. nodes() yönteminin sonucuna query(), value(), exist() ve nodes() gibi xml veri tipi yöntemleri uygulayabilirsiniz. Ancak, XML örneğini değiştirmek için modify() yöntemini uygulayamazsınız.

Ayrıca, satır kümesindeki bağlam düğümü gerçekleşemiyor. Yani, bunu bir SELECT ifadesinde kullanamazsınız. Ancak bunu IS NULL ve COUNT(*) içinde kullanabilirsiniz.

Nodes() yöntemini kullanma senaryoları, XML'in satır kümesi görünümünü sağlayan OPENXML (Transact-SQL) yöntemiyle aynıdır. Ancak, birkaç satır XML belgesi içeren bir tabloda nodes() yöntemini kullandığınızda imleç kullanmak zorunda değilsiniz.

Nodes() yöntemiyle döndürülen satır kümesi, isimsiz bir satır kümesidir. Bu yüzden, aliasing kullanılarak açıkça adlandırılmalıdır.

Nodes () fonksiyonu, kullanıcı tanımlı bir fonksiyonun sonuçlarına doğrudan uygulanamaz. Nodes() fonksiyonunu, skaler kullanıcı tanımlı bir fonksiyonun sonucunda kullanmak için şunları yapabilirsiniz:

  • Kullanıcı tarafından tanımlanan fonksiyonun sonucunu bir değişkene atayın
  • Kullanıcı tanımlı fonksiyon döndürme değerine sütun alias atamak için türetilmiş bir tablo kullanın ve ardından alias'tan seçim yapın CROSS APPLY .

Aşağıdaki örnek, kullanıcı tanımlı bir fonksiyonun sonucundan seçim yapmanın bir yolunu CROSS APPLY göstermektedir.

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 tipli bir değişkene karşı nodes() yöntemi kullanılarak

Aşağıdaki örnekte, üst düzey bir <Root> öğe ve üç <row> alt öğesi olan bir XML belgesi vardır. Sorgu, her nodes()<row eleman için ayrı bir bağlam düğümü oluşturmak için bu > yöntemi kullanır. Yöntem, nodes() üç satırlı bir satır seti döndürür. Her satır, orijinal XML'in mantıksal bir kopyasına sahiptir ve her bağlam düğümü orijinal belgede farklı <row> bir öğeyi tanımlar.

Sorgu daha sonra her satırdan bağlam düğümünü döndürür:

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 örnek sonuçta, sorgu yöntemi bağlam öğesini 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"/>  

Ebeveyn accessor'u bağlam düğümlerine uygularsak, üç unsurun tamamını döndürür <Root> :

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

İşte sonuç:

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

nodes() yöntemini xml tipi bir sütuna karşı belirlemek

Bu örnekte bisiklet üretim talimatları kullanılır ve ProductModel tablosunun Instructions xml tip sütununda saklanır.

Aşağıdaki örnekte, nodes() yöntem tablodaki Instructionsxml tipli ProductModel sütunla karşılaştırılır.

Yöntem, nodes() yolu belirterek < öğeleri Location>/MI:root/MI:Location bağlam düğümleri olarak ayarlar. Ortaya çıkan satır kümesi, orijinal belgenin mantıksal kopyalarını içerir; belgedeki her <Location> düğüm için bir tane ve bağlam düğümü elemana <Location> ayarlanır. Sonuç olarak, nodes() fonksiyon bir dizi <Location> bağlam düğümü verir.

Bu satır kümesine karşı yöntem, query() her satırdaki öğeyi self::node ister <Location> ve döndürür.

Bu örnekte, sorgu her <Location> elemanı belirli bir ürün modelinin üretim talimatları belgesinde bir bağlam düğümü olarak ayarlar. Bu bağlam düğümlerini kullanarak aşağıdaki gibi değerleri alabilirsiniz:

  • Her birinde Konum Kimliği bulun <Location>

  • Her birinden üretim adımlarını (<step> alt elemanları) alın <Location>

Bu sorgu, yöntemde kısaltılmış sözdiziminin '.'self::node() belirtildiği query() bağlam öğesini döndürür.

Aşağıdakilere dikkat edin:

  • Yöntem, nodes() Talimatlar sütununa uygulanır ve bir satır kümesi döndürür, T (C). Bu sıra kümesi, orijinal üretim talimatları belgesinin mantıksal kopyalarını içerir ve /root/Location bağlam öğesi olarak kullanılır.

  • CROSS APPLY tablodaki nodes() her satıra uygulanır ProductModel ve sadece 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  
    

    İşte kısmi sonuç:

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

Başka bir nodes() yöntemiyle döndürülen satır kümesine nodes() uygulanır

Aşağıdaki kod, tablo sütunundaki Instructions üretim talimatları ProductModel için XML belgelerini sorgular. Sorgu, ürün model kimliği, üretim konumları ve üretim adımlarını içeren bir satır seti döndürür.

Aşağıdakilere dikkat edin:

  • Yöntem nodes() sütuna Instructions uygulanır ve satır T1 (Locations) kümesini döndürür. Bu sıra kümesi, öğe bağlamı olarak öğe olarak elem içeren orijinal üretim talimatları belgesinin /root/Location mantıksal kopyalarını içerir.

  • nodes() satır kümesine uygulanır T1 (Locations) ve satır T2 (steps) kümesini döndürür. Bu sıra kümesi, öğe bağlamı olarak öğe olarak elem içeren orijinal üretim talimatları belgesinin /root/Location/step mantıksal kopyalarını içerir.

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         

İşte sonuç:

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

Sorgu, ön MI eki iki kez ilan eder. Bunun yerine, WITH XMLNAMESPACES ön eki bir kez ilan edip sorguda kullanabilirsin:

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.

WITH XMLNAMESPACES ile Sorgulara Ad Alanları Ekleme
XML Verisi Örnekleri Oluşturmak
xml Veri Türü Yöntemleri