Share via


XML işçi (XQuery)

XQuery içinde kullanabileceğiniz direct ve computed XML yapısı içinde bir sorgu oluşturmak için Kurucular'ı tıklatın.

Not

Önce Kurucular desteklenmiyor özelliğini kullandığınızda, düğüm adları hesaplamak hesaplanan SQL Server. Bu nedenle, arasında fark yoktur direct ve computed Kurucular.

Içinde önce SQL Server, yalnızca yapı modu, çubuðu ve XMLSpace ilke veya sınır boşluk ilkesi şeridine destekleniyor.

Doğrudan Kurucularını kullanma

Doğrudan Kurucular kullandığınızda, XML oluşturma, XML benzeri sözdizimi belirtin.Aşağıdaki örnekte, XML inşaat tarafından bir doğrudan Kurucular görülmektedir.

Öğeler oluşturma

XML gösterimler kullanarak öğeleri gerçekleştirebilmesi.Aşağıdaki örnek, oluşturur ve doğrudan bir öğe kurucu ifade kullanan bir <ProductModel> öğe. Yapılandırılmış öğe üç alt öğeleri vardır.

  • Bir metin düğümü.

  • Iki öğe düğümü, <Özeti> ve <Özellikleri>.

    • The <Summary> element has one text node alt whose value is "Some description".

    • The <Features> element has three element node children, <Color>, <Weight>, and <Warranty>.Bu düğümlerin her birinde bir metin düğümü alt öğesi bulunur ve kırmızı, 25, 2 yıllık parça ve işçilik, değerleri sırasıyla var.

declare @x xml
set @x=''
select @x.query('<ProductModel ProductModelID="111">
This is product model catalog description.
<Summary>Some description</Summary>
<Features>
  <Color>Red</Color>
  <Weight>25</Weight>
  <Warranty>2 years parts and labor</Warranty>
</Features></ProductModel>')

Sonuç XML budur:

<ProductModel ProductModelID="111">
  This is product model catalog description.
  <Summary>Some description</Summary>
  <Features>
    <Color>Red</Color>
    <Weight>25</Weight>
    <Warranty>2 years parts and labor</Warranty>
  </Features>
</ProductModel>

Bu örnekte gösterildiği gibi sabit ifade, öğelerden oluştururken yararlı olsa da, doğru gücünü bu XQuery dil özelliği, dinamik olarak da bir veritabanından veri ayıklayan bir XML yapılandırma yeteneğidir.Kaşlı ayraçlar, sorgu ve deyimler belirtmek için kullanabilirsiniz.Sonuç XML biçiminde ifade değeri ile değiştirilir.Örneğin, aşağıdaki, yapılar sorgu bir <NewRoot> bir alt öğesi ('olan öğe<e>). Öğenin değerini <e>bir yol belirterek hesaplanan ifade içine, kaşlı ayraçlar ("{...}").

DECLARE @x xml
SET @x='<root>5</root>'
SELECT @x.query('<NewRoot><e> { /root } </e></NewRoot>')

Ayraçlar bağlam geçişi simgeleri gibi Davranma ve sorgu değerlendirme için XML inşaat sorgudan geçin.Bu durumda, XQuery yol ifade içine, kaşlı ayraçlar /root, değerlendirilir ve sonuçlar için değiştirdi.

Bu sonucu oluşur:

<NewRoot>
  <e>
    <root>5</root>
  </e>
</NewRoot>

Aşağıdaki sorgu için bir öncekinin benzer.Ancak, ifade kaşlı ayraçlar içinde belirtir data() Atomik değerini almak için işlev <root> öğe ve oluşturulmuş öğeye atar <e>.

DECLARE @x xml
SET @x='<root>5</root>'
DECLARE @y xml
SET @y = (SELECT @x.query('
                           <NewRoot>
                             <e> { data(/root) } </e>
                           </NewRoot>' ))
SELECT @y

Bu sonucu oluşur:

<NewRoot>
  <e>5</e>
</NewRoot>

Kaşlı ayraçlar, metninizi bağlam geçişi simgeleri yerine bir parçası olarak kullanmak isterseniz, bunları olarak çıkış "}}"veya"{{" aşağıdaki örnekte gösterildiği gibi:

DECLARE @x xml
SET @x='<root>5</root>'
DECLARE @y xml
SET @y = (SELECT @x.query('
<NewRoot> Hello, I can use {{ and  }} as part of my text</NewRoot>'))
SELECT @y

Bu sonucu oluşur:

<NewRoot> Hello, I can use { and  } as part of my text</NewRoot>

Aşağıdaki sorgu, doğrudan bir öğe kurucu kullanarak öğeleri oluşturarak, başka bir örnektir.Ayrıca, değeri <FirstLocation> öğe, kaşlı ayraçlar içinde ifade yürütmek yoluyla elde edilir. Sorgu ifadesi üretim adımları ilk iş merkezi konumda gelen yönergeler verir sütun Production.ProductModel tablo.

SELECT Instructions.query('
    declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
        <FirstLocation>
           { /AWMI:root/AWMI:Location[1]/AWMI:step }
        </FirstLocation> 
') as Result 
FROM Production.ProductModel
WHERE ProductModelID=7

Bu sonucu oluşur:

<FirstLocation>
  <AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">
      Insert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. 
  </AWMI:step>
  <AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">
      Attach <AWMI:tool>Trim Jig TJ-26</AWMI:tool> to the upper and lower right corners of the aluminum sheet. 
  </AWMI:step>
   ...
</FirstLocation>

Öğenin içeriği, XML işçi

Aşağıdaki örnek, doğrudan bir öğe kurucu kullanarak öğe içeriği oluşturmak yoluyla bu ifadeler davranışını gösterir.Aşağıdaki örnekte, doğrudan bir öğe kurucu bir ifade belirtir.Bu ifade için bir metin düğümü sonuç XML içinde oluşturulur.

declare @x xml
set @x='
<root>
  <step>This is step 1</step>
  <step>This is step 2</step>
  <step>This is step 3</step>
</root>'
select @x.query('
<result>
 { for $i in /root[1]/step
    return string($i)
 }
</result>')

Ifade değerlendirme kaynaklanan atomik değer sırası için metin düğümünün sonucu gösterildiği gibi bitişik atomik değerleri arasında eklenen alan eklenir.Bir alt oluşturulmuş öğesi var.Bunun sonucu gösterdiği değeri içeren bir metin düğümdür.

<result>This is step 1 This is step 2 This is step 3</result>

Üç metin düğümleri oluşturma üç ayrı ifade belirtirseniz, bir ifade yerine birleştirme, sonuç XML olarak bir tek metin düğümü bitişik metin düğümlerin birleştirilir.

declare @x xml
set @x='
<root>
  <step>This is step 1</step>
  <step>This is step 2</step>
  <step>This is step 3</step>
</root>'
select @x.query('
<result>
 { string(/root[1]/step[1]) }
 { string(/root[1]/step[2]) }
 { string(/root[1]/step[3]) }
</result>')

Bir alt oluşturulmuş öğe düğümü var.Bunun sonucu gösterdiği değeri içeren bir metin düğümdür.

<result>This is step 1This is step 2This is step 3</result>

Öznitelikleri oluşturma

Öğeleri doğrudan bir öğe kurucu kullanarak oluşturmak yoluyla, ayrıca öğenin özniteliklerini XML benzeri bir sözdizimi kullanarak aşağıdaki örnekte gösterildiği gibi belirtebilirsiniz:

declare @x xml
set @x=''
select @x.query('<ProductModel ProductModelID="111">
This is product model catalog description.
<Summary>Some description</Summary>
</ProductModel>')

Sonuç XML budur:

<ProductModel ProductModelID="111">
  This is product model catalog description.
  <Summary>Some description</Summary>
</ProductModel>

Yapılandırılmış öğe <ProductModel> bir Productmodelıd sahip öznitelik ve bu alt düğümler:

  • Bir metin düğümü This is product model catalog description.

  • Bir öğe düğümü <Summary>. Bu düğüm bir metin düğümü alt sahiptir... Some description.

Bir öznitelik oluşturmak yoluyla, değeri kaşlı ayraçlar içinde bir ifade ile belirtebilirsiniz.Bu durumda, sonucu ifade özniteliği değeri olarak döndürülür.

Aşağıdaki örnekte, data() işlev, kesinlikle gerekli değildir. Atadığınız çünkü ifade, öznitelik değeri data() Belirtilen yazılı değerini almak için örtülü olarak uygulanan ifade.

DECLARE @x xml
SET @x='<root>5</root>'
DECLARE @y xml
SET @y = (SELECT @x.query('<NewRoot attr="{ data(/root) }" ></NewRoot>'))
SELECT @y

Bu sonucu oluşur:

<NewRoot attr="5" />

Aşağıdaki ifadeler LocationID ve SetupHrs belirtilir, diğer bir örnek ise, öznitelik inşaat.Bu ifadeler XML yönerge sütunundaki karşı değerlendirilir.Yazılı ifade değerli öznitelikleri atanır.

SELECT Instructions.query('
    declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
        <FirstLocation 
         LocationID="{ (/AWMI:root/AWMI:Location[1]/@LocationID)[1] }"
         SetupHrs = "{ (/AWMI:root/AWMI:Location[1]/@SetupHours)[1] }" >
           { /AWMI:root/AWMI:Location[1]/AWMI:step }
        </FirstLocation> 
') as Result 
FROM  Production.ProductModel
where ProductModelID=7

Bu kısmi kaynaklanır:

<FirstLocation LocationID="10" SetupHours="0.5" >
  <AWMI:step … 
  </AWMI:step>
  ...
</FirstLocation>

Uygulama kısıtlamaları

Sınırlamaları şunlardır:

  • Birden fazla veya (dize ve XQuery deyim) özniteliği ifade karma desteklenmez.Örneğin, aşağıdaki sorguda gösterildiği gibi XML oluşturma yeri Item bir sabit değer ve değer 5 Sorguda değerlendirerek elde ifade:

    <a attr="Item 5" />
    

    Sabit dize karıştırma bir ifade ile ({/ x}) ve bu desteklenip desteklenmediği için aşağıdaki sorgu hata verir:

    DECLARE @x xml
    SET @x ='<x>5</x>'
    SELECT @x.query( '<a attr="Item {/x}"/>' ) 
    

    Bu durum, aşağıdaki seçeneklere sahipsiniz:

    • Öznitelik değeri tarafından iki atomik değerlerin birleşik bağ kümeleri oluşturur.Atomik bu değerleri atomik değerler arasında boşluk olan öznitelik değerinin içine seri hale:

      SELECT @x.query( '<a attr="{''Item'', data(/x)}"/>' ) 
      

      Bu sonucu oluşur:

      <a attr="Item 5" />
      
    • Use Birleştir işlev iki dize bağımsız değişkeni sonuç öznitelik değeri bağlamak için:

      SELECT @x.query( '<a attr="{concat(''Item'', /x[1])}"/>' ) 
      

      Bu durumda, iki dize değerlerini arasında eklenen hiçbir alan yok.Iki değer arasında bir boşluk isterseniz, açıkça sağlaması gerekir.

      Bu sonucu oluşur:

      <a attr="Item5" />
      
  • öznitelik değeri olarak birden çok ifadeler desteklenmiyor.Örneğin, aşağıdaki sorgu hata verir:

    DECLARE @x xml
    SET @x ='<x>5</x>'
    SELECT @x.query( '<a attr="{/x}{/x}"/>' )
    
  • Türdeş olmayan dizileri desteklenmiyor.Herhangi bir öznitelik değeri, bir hata döndürecektir gibi aşağıdaki örnekte gösterildiği gibi farklı bir sıra atama girişimi.Bu örnek, türdeş olmayan bir sıra, "Madde" dize ve bir öğe <x>, öznitelik değerini olarak belirtilir:

    DECLARE @x xml
    SET @x ='<x>5</x>'
    select @x.query( '<a attr="{''Item'', /x }" />')
    

    Uygulama, data() Atomik ifadenin değerinin getireceğinden işlev, sorgu çalışır. /x, dize ile birleştirilmiş. Bir dizi atomik değerleri aşağıdadır:

    SELECT @x.query( '<a attr="{''Item'', data(/x)}"/>' ) 
    

    Bu sonucu oluşur:

    <a attr="Item 5" />
    
  • Öznitelik düğümü sipariş statik tür denetimi sırasında yerine, seri hale getirme sırasında uygulanır.Sonra olmayan öznitelik düğümü öznitelik eklemek nedeni, örneğin, aşağıdaki sorgu başarısız olur.

    select convert(xml, '').query('
    element x { attribute att { "pass" }, element y { "Element text" }, attribute att2 { "fail" } }
    ')
    go
    

    Yukarıdaki sorgu hata verir:

    XML well-formedness check: Attribute cannot appear outside of element declaration. Rewrite your XQuery so it returns well-formed XML.
    

Ad alanları ekleme

Doğrudan Kurucular kullanarak XML oluşturarak, oluşturulmuş bir öğe ve öznitelik adlarının bir ad alanı önekini kullanarak uygun.Aşağıdaki yollarla için ad alanı öneki bağlayabilirsiniz:

  • Bir ad alanı bildirim kullanarak öznitelik.

  • WITH XMLNAMESPACES yan tümce kullanarak.

  • Içinde XQuery giriş.

Ad eklemek için bir ad alanı bildirim öznitelik kullanma

Aşağıdaki örnek, bir ad alanı bildirim kullanan öznitelik öğesinin yapı içinde <a> bir varsayılan ad boşluğu bildirmek için . Alt öğesinin yapı <b> üst öğe olarak bildirilen bir varsayılan ad boşluğu, bildirim geri alır.

declare @x xml
set @x ='<x>5</x>'
select @x.query( '
  <a xmlns="a">
    <b />
  </a>' ) 

Bu sonucu oluşur:

<a xmlns="a">
  <b  />
</a>

Bir önek için ad atayabilirsiniz.Öğe inşaat ilgili olarak belirtilen öneki <a>.

declare @x xml
set @x ='<x>5</x>'
select @x.query( '
  <x:a xmlns:x="a">
    <b/>
  </x:a>' )

Bu sonucu oluşur:

<x:a xmlns:x="a">
  <b />
</x:a>

Ile başlayan SQL Server 2005, kaydını olabilir - bir varsayılan ad XML inşaat bildirir, ancak kaydını edemiyor - bir ad alanı öneki bildirin. Kaydını edemiyor çünkü, aşağıdaki sorgu hata verir - öğesinin yapı içinde belirtilen bir önek bildirmek. <b>.

declare @x xml
set @x ='<x>5</x>'
select @x.query( '
  <x:a xmlns:x="a">
    <b xmlns:x=""/>
  </x:a>' )

Yeni oluşturulmuş ad sorgu içinde kullanmak kullanılabilir.Örneğin, aşağıdaki sorgu bir ad alanı içinde öğe oluşturma bildirir. <FirstLocation>ve LocationID ve SetupHrs öznitelik değerleri ifadelerde öneki belirtir.

SELECT Instructions.query('
        <FirstLocation xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
         LocationID="{ (/AWMI:root/AWMI:Location[1]/@LocationID)[1] }"
         SetupHrs = "{ (/AWMI:root/AWMI:Location[1]/@SetupHours)[1] }" >
           { /AWMI:root/AWMI:Location[1]/AWMI:step }
        </FirstLocation> 
') as Result 
FROM  Production.ProductModel
where ProductModelID=7

Bu yolla yeni bir ad alanı öneki oluşturma bu önek için önceden varolan bir ad alanı bildirim kılar unutmayın.Örneğin, ad alanı bildirim AWMI="http://someURI", sorguda giriş ad alanı bildiriminde'tarafından geçersiz kılınır <FirstLocation> öğe.

SELECT Instructions.query('
declare namespace AWMI="http://someURI";
        <FirstLocation xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
         LocationID="{ (/AWMI:root/AWMI:Location[1]/@LocationID)[1] }"
         SetupHrs = "{ (/AWMI:root/AWMI:Location[1]/@SetupHours)[1] }" >
           { /AWMI:root/AWMI:Location[1]/AWMI:step }
        </FirstLocation> 
') as Result 
FROM  Production.ProductModel
where ProductModelID=7

Ad eklemek için bir giriş kullanma

Bu örnek, ad boşlukları için oluşturulmuş XML eklenmesi göstermektedir.Varsayılan bir ad sorgusu giriş bildirildi.

declare @x xml
set @x ='<x>5</x>'
select @x.query( '
           declare default element namespace "a";
            <a><b /></a>' )

Öğe inşaat ilgili olarak unutmayın. <b>, bildiriminde ad alanı özniteliği değeri olarak boş bir dize ile belirtilir. Bu kaydını-üst içinde bildirilen varsayılan ad boşluğunu bildirir.

This is the result:
<a xmlns="a">
  <b  />
</a>

XML işçi ve boşlukları işleme

XML inşaat öğenin içeriği, beyaz boşluk karakterleri içerebilir.Bu karakterler aşağıdaki şekillerde yönetilir:

  • Ad alanı urı ' larý beyaz boşluk karakterleri XSD türü olarak kabul edilir anyURI. Bu özellikle nasıl işlendiğini oluşur:

    • Başlangıç ve bitiş herhangi bir beyaz boşluk karakteri atılır.

    • Iç beyaz boşluk karakteri değerleri tek bir alana daraltılmışsa

  • Öznitelik içeriği içinde satır besleme karakterleri boşlukla değiştirilir.Tüm diğer beyaz boşluk karakterleri, olduğu gibi kalır.

  • Öğe içinde beyaz boşluk korunur.

Aşağıdaki örnekte, XML inşaat beyaz boşluk işlemede gösterilmektedir:

-- line feed is repaced by space.
declare @x xml
set @x=''
select @x.query('

declare namespace myNS="   http://     
 abc/
xyz

";
<test attr="    my 
test   attr 
value    " >

<a>

This     is  a

test

</a>
</test>
') as XML_Result 

 

Bu sonucu oluşur:

-- result
<test attr="<test attr="    my test   attr  value    "><a>

This     is  a

test

</a></test>
"><a>

This     is  a

test

</a></test>

Doğrudan başka bir XML Kurucularını

Oluşturucular, işlem yönergeleri ve XML açıklamaları için ilgili XML yapýsý aynı sözdizimini kullanır.Kurucular düğümler de desteklenir, ancak öncelikle içinde XML DML metin düğümleri oluşturmak için kullanılan bir metin için hesaplanır.

Not    Örnekte belirli bir açık metin düğümü kurucusunu kullanarak örnek için bkzEkle (XML DML).

Bir öğe, iki öznitelik, açıklama ve bir işlem yönergesi, aşağıdaki sorguda, oluşturulmuş XML içerir.Önce virgül kullanılan Not <FirstLocation>, çünkü bu bir sıra oluşturulur.

SELECT Instructions.query('
  declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
   <?myProcessingInstr abc="value" ?>, 
   <FirstLocation 
        WorkCtrID = "{ (/AWMI:root/AWMI:Location[1]/@LocationID)[1] }"
        SetupHrs = "{ (/AWMI:root/AWMI:Location[1]/@SetupHours)[1] }" >
       <!-- some comment -->
       <?myPI some processing instructions ?>
       { (/AWMI:root/AWMI:Location[1]/AWMI:step) }
    </FirstLocation> 
') as Result 
FROM Production.ProductModel
where ProductModelID=7

Bu kısmi kaynaklanır:

<?myProcessingInstr abc="value" ?>
<FirstLocation WorkCtrID="10" SetupHrs="0.5">
  <!-- some comment -->
  <?myPI some processing instructions ?>
  <AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">I
  nsert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. 
  </AWMI:step>
    ...
/FirstLocation>

Hesaplanan Kurucularını kullanma

.In this case, you specify the keywords that identify the type of node you want to construct.Yalnızca aşağıdaki anahtar sözcükler desteklenir:

  • öğe

  • öznitelik

  • text

Öğe ve öznitelik düğümlerin, bu anahtar sözcükler, düğüm adı gelir ve ayrıca, ayraç içine bir ifade tarafından içeriği söz konusu düğüm için oluşturur.Aşağıdaki örnekte, bu XML oluşturma:

<root>
  <ProductModel PID="5">Some text <summary>Some Summary</summary></ProductModel>
</root>

Bu, kullandığı Kurucular XML oluşturmak hesaplanan sorgudur:

declare @x xml
set @x=''
select @x.query('element root 
               { 
                  element ProductModel
     {
attribute PID { 5 },
text{"Some text "},
    element summary { "Some Summary" }
 }
               } ')

Düğüm içerik oluşturan ifade, bir sorgu ifadesinde belirtebilirsiniz.

declare @x xml
set @x='<a attr="5"><b>some summary</b></a>'
select @x.query('element root 
               { 
                  element ProductModel
     {
attribute PID { /a/@attr },
text{"Some text "},
    element summary { /a/b }
 }
               } ')

Hesaplanmış öğe ve öznitelik Oluşturucusu XQuery belirtiminde tanımlandığı gibi düğüm adları hesaplamak izin unutmayın.Zaman içinde doğrudan Kurucular kullanma SQL Server, öğe ve öznitelik, düğüm adları sabit hazır belirtilmelidir. Bu nedenle, öğeleri ve öznitelikleri için hesaplanan Kurucular ve doğrudan oluşturucular arasında fark yoktur.

Aşağıdaki örnekte, düğümlerin oluşturulmuş içerik yönergeleri sütunda depolanan XML üretim yönergeleri'ndan elde xml ProductModel tablosundaki veri türü.

SELECT Instructions.query('
  declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
   element FirstLocation 
     {
        attribute LocationID { (/AWMI:root/AWMI:Location[1]/@LocationID)[1] },
        element   AllTheSteps { /AWMI:root/AWMI:Location[1]/AWMI:step }
     }
') as Result 
FROM  Production.ProductModel
where ProductModelID=7

Bu kısmi kaynaklanır:

<FirstLocation LocationID="10">
  <AllTheSteps>
    <AWMI:step> ... </AWMI:step>
    <AWMI:step> ... </AWMI:step>
    ...
  </AllTheSteps>
</FirstLocation>  

Ek uygulama kısıtlamaları

Öznitelik Oluşturucusu, yeni bir ad alanı bildirmek için kullanılamaz olarak hesaplanır.Ayrıca, aşağıdaki hesaplanan Kurucular içinde desteklenmez. SQL Server:

  • Hesaplanmış bir belge düğümü Kurucular

  • Hesaplanmış bir işlem yönergesi Kurucular

  • Hesaplanan açıklama Kurucular

See Also

Concepts