Aracılığıyla paylaş


flwor deyimi ve yineleme (XQuery)

XQuery flwor yineleme sözdizimi tanımlar.FLWOR is the acronym for for, let, where, order by, and return.

flwor deyim aşağıdaki bölümlerini oluşur:

  • Bir veya daha fazla sıraları giriş için bir veya daha fazla yineleyici değişkenler bağlama yan tümceleri için.

    Giriş sıralarını XPath ifadeleri gibi diğer XQuery ifadeler olabilir.Atomik değerleri dizisi ya da düğümleri kısımlarının kullanılırlar.Atomik Değer serilerinin harfleri veya yapıcı işlevleri kullanılarak oluşturulmuş olabilir.Oluşturulan xml düğümleri olarak giriş sıralarında verilmez SQL Server.

  • İsteğe bağlı bir let yan tümce tümce tümce.Bu yan tümce tümce belirli bir döngü için verilen değişken bir değer atar.Atanan ifade bir XPath deyimi gibi bir XQuery ifade olabilir ve bir düğüm sırası ya da Atomik değerleri dizisi döndürür.Atomik Değer serilerinin harfleri veya yapıcı işlevleri kullanılarak oluşturulmuş olabilir.Oluşturulan xml düğümleri olarak giriş sıralarında verilmez SQL Server.

  • Bir yineleyici değişken.Bu değişken türü isteğe bağlı bir onaylama işlemi kullanarak olabilir as anahtar sözcüğü.

  • İsteğe bağlı bir where yan tümce tümce tümce.Bu yan tümce tümce yineleme üzerinde filtre koşulunu uygular.

  • İsteğe bağlı bir order by yan tümce tümce tümce.

  • A return ifade.deyim , return Yan tümce yapıları sonucunu flwor deyim.

Örneğin, üzerinde aşağıdaki sorgu dolaşır <Step> ilk üretim konumdaki öğeleri dize değerini verir ve <Step> düğümleri:

declare @x xml
set @x='<ManuInstructions ProductModelID="1" ProductModelName="SomeBike" >
<Location LocationID="L1" >
  <Step>Manu step 1 at Loc 1</Step>
  <Step>Manu step 2 at Loc 1</Step>
  <Step>Manu step 3 at Loc 1</Step>
</Location>
<Location LocationID="L2" >
  <Step>Manu step 1 at Loc 2</Step>
  <Step>Manu step 2 at Loc 2</Step>
  <Step>Manu step 3 at Loc 2</Step>
</Location>
</ManuInstructions>'
SELECT @x.query('
   for $step in /ManuInstructions/Location[1]/Step
   return string($step)
')

Bu sonucu verir:

Manu step 1 at Loc 1 Manu step 2 at Loc 1 Manu step 3 at Loc 1

ProductModel tablo bir yazılı xml sütun yönergeleri sütun karşı belirtilen aşağıdaki sorguyu önceki bir benzer olmasıdır.Tüm üretim adımları sorgu dolaşır <step> öğeleri, ilk iş merkezi konumu için özel bir ürün.

SELECT Instructions.query('
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $Step in //AWMI:root/AWMI:Location[1]/AWMI:step
      return
           string($Step) 
') as Result
FROM Production.ProductModel
where ProductModelID=7

Önceki sorgudan aşağıdakilere dikkat edin:

  • The $Step is the iterator variable.

  • The path expression, //AWMI:root/AWMI:Location[1]/AWMI:step, generates the input sequence.Bu sıralama sırası olan <step> ilk düğümü alt öğesi <Location> öğe düğümü.

  • İsteğe bağlı koşul yan tümce tümce tümce where, kullanılmayan.

  • The return expression returns a string value from the <step> element.

The string function (XQuery) is used to retrieve the string value of the <step> node.

Bu kısmi bir sonucudur:

Insert aluminum sheet MS-2341 into the T-85A framing tool. 
Attach Trim Jig TJ-26 to the upper and lower right corners of 
the aluminum sheet. ....       

İzin verilen ek giriş sequences örnekleri şunlardır:

declare @x xml
set @x=''
SELECT @x.query('
for $a in (1, 2, 3)
  return $a')
-- result = 1 2 3 

declare @x xml
set @x=''
SELECT @x.query('
for $a in 
   for $b in (1, 2, 3)
      return $b
return $a')
-- result = 1 2 3

declare @x xml
set @x='<ROOT><a>111</a></ROOT>'
SELECT @x.query('
  for $a in (xs:string( "test"), xs:double( "12" ), data(/ROOT/a ))
  return $a')
-- result test 12 111

De SQL Server, türdeş olmayan sıraları izin yok.Özellikle, Atomik değerlerin ve düğümleri bir karışımını içeren dizileri izin verilmez.

Yineleme ile birlikte kullanılan sık sık xml yapım sözdizimi içinde xml dönüştürme biçimleri, sonraki sorgu gösterildiği gibi.

De AdventureWorks2008R2 örnek veritabanı, depolanan üretim yönergeleri yönergeleri sütun , Production.ProductModel tablo aşağıdaki formu vardır:

<Location LocationID="10" LaborHours="1.2" 
            SetupHours=".2" MachineHours=".1">
  <step>describes 1st manu step</step>
   <step>describes 2nd manu step</step>
   ...
</Location>
...

Aşağıdaki sorgu olan yeni xml yapıları <Location> öğeleri ile iş merkezi konum özniteliklerini alt öğeler döndürülen:

<Location>
   <LocationID>10</LocationID>
   <LaborHours>1.2</LaborHours>
   <SetupHours>.2</SteupHours>
   <MachineHours>.1</MachineHours>
</Location>
...

Bu sorgu şöyledir:

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
        for $WC in /AWMI:root/AWMI:Location
        return
          <Location>
            <LocationID> { data($WC/@LocationID) } </LocationID>
            <LaborHours>   { data($WC/@LaborHours) }   </LaborHours>
            <SetupHours>   { data($WC/@SetupHours) }   </SetupHours>
            <MachineHours> { data($WC/@MachineHours) } </MachineHours>
          </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7

Önceki sorgudan aşağıdakilere dikkat edin:

  • flwor deyim bir dizi alır <Location> öğeleri için belirli bir ürün.

  • The data function (XQuery) is used to extract the value of each attribute so they will be added to the resulting XML as text nodes instead of as attributes.

  • ifade Yan tümcesi KARAKTERİYLE istediğiniz xml oluşturur.

Bu kısmi bir sonucudur:

<Location>
  <LocationID>10</LocationID>
  <LaborHours>2.5</LaborHours>
  <SetupHours>0.5</SetupHours>
  <MachineHours>3</MachineHours>
</Location>
<Location>
   ...
<Location>
...

Let kullanarak yan tümcesi

Kullanabileceğiniz let yan tümce tümce tümce adına yinelenen başvurabilirsiniz için başvuran değişken tarafından ifadelerisql Server 2008'de ifade atanmış olduğunu unutmayın bir let deðiþken eklenen her saat değişken sorgu. başvuru yaptığı sorgu içineBu deyim yalnızca bir kez yürütülecek değil, ancak gibi birçok kez ifade olarak başvurulan anlamına gelir.

De AdventureWorks2008R2 veritabanı, üretim yönergeleri içeren gerekli araçlar ile ilgili bilgi ve araçlar kullanıldığı yeri.Aşağıdaki sorgu kullanır let yan tümce tümce tümcesi listesine araçs konumları yan tümce tümceı sıra üretim modeli oluşturmak için gerekli yere her araç gerekiyor.

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
        for $T in //AWMI:tool
            let $L := //AWMI:Location[.//AWMI:tool[.=data($T)]]
        return
          <tool desc="{data($T)}" Locations="{data($L/@LocationID)}"/>
') as Result
FROM Production.ProductModel
where ProductModelID=7

Kullanarak where yan tümcesi

Kullanabileceğiniz where yan tümce tümce tümce Süzme sonuçlar, bir interation.Bu kullanarak bu sonraki örnekte gösterilmiştir AdventureWorks2008R2 örnek veritabanı.

Bir bisiklet üretiminde üretim süreci bir dizi iş merkezi konumları ile gider.Her iş merkezi konumu, üretim adımları, bir sırayı tanımlar.Bir bisiklet modeli üretme ve üretim adımları Üçten az olan yalnızca o iş merkezi konumları aşağıdaki sorgu alır.Diğer bir deyişle, Üçten az çok sahip oldukları <step> öğeleri.

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in /AWMI:root/AWMI:Location
      where count($WC/AWMI:step) < 3
      return
          <Location >
           { $WC/@LocationID } 
          </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7

Önceki sorgu aşağıdaki unutmayın:

  • The where keyword uses the count() function to count the number of <step> child elements in each work center location.

  • The return expression constructs the XML that you want from the results of the iteration.

Bu sonucu verir:

<Location LocationID="30"/> 

Sonucu ifade , where yan tümce tümce tümce belirtilen sırada aşağıdaki kuralları kullanarak bir Boole değerine dönüştürülür.Bunlar, tamsayılara izin verilen dışında yol ifadelerde yüklemler kurallarına aynıdır:

  1. If the where expression returns an empty sequence, its effective Boolean value is False.

  2. If the where expression returns one simple Boolean type value, that value is the effective Boolean value.

  3. If the where expression returns a sequence that contains at least one node, the effective Boolean value is True.

  4. Aksi halde, statik bir hata yükseltir.

flwor içindeki birden çok değişken bağlama

Bir tek flwor olabilir ifade serileri için çok sayıda değişken bağlar.Aşağıdaki örnekte, sorgu karşı bir untyped xml değişkeni belirtildi.İlk flowr ifade verir <Step> her öğenin alt <Location> öğesi.

declare @x xml
set @x='<ManuInstructions ProductModelID="1" ProductModelName="SomeBike" >
<Location LocationID="L1" >
  <Step>Manu step 1 at Loc 1</Step>
  <Step>Manu step 2 at Loc 1</Step>
  <Step>Manu step 3 at Loc 1</Step>
</Location>
<Location LocationID="L2" >
  <Step>Manu step 1 at Loc 2</Step>
  <Step>Manu step 2 at Loc 2</Step>
  <Step>Manu step 3 at Loc 2</Step>
</Location>
</ManuInstructions>'
SELECT @x.query('
   for $Loc in /ManuInstructions/Location,
       $FirstStep in $Loc/Step[1]
   return 
       string($FirstStep)
')

Önceki sorgudan aşağıdakilere dikkat edin:

  • The for expression defines $Loc and $FirstStep variables.

  • The two expressions, /ManuInstructions/Location and $FirstStep in $Loc/Step[1], are correlated in that the values of $FirstStep depend on the values of $Loc.

  • İlişkili ifade $Loc bir dizi üretir <Location> öğeleri.Her <Location> öğesi, $FirstStep bir dizi üretir <Step> öğesi, singleton.

  • $LocBelirtilen ifade ile ilgili $FirstStep değişkeni.

Bu sonucu verir:

Manu step 1 at Loc 1 
Manu step 1 at Loc 2

Yazılı yönerge sütun karşı belirtilen aşağıdaki sorgu, benzer xml , sütun, ProductModel tablo.xml yapım (XQuery) , istediğiniz xml oluşturmak için kullanılır.

SELECT Instructions.query('
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in /root/Location,
            $S  in $WC/step
      return
          <Step LocationID= "{$WC/@LocationID }" >
            { $S/node() }
          </Step>
') as Result
FROM  Production.ProductModel
WHERE ProductModelID=7

Önceki sorgu aşağıdaki unutmayın:

  • The for clause defines two variables, $WC and $S.İlişkili ifade $WC İş merkezi konumlarda üretim bir bisiklet ürün modeli bir dizi oluştururAtanan yol ifade $S değişkeni oluşturur her iş merkezi konum sırası için adımlar $WC.

  • Return deyim olan xml yapıları bir <Step> Üretim adım içeren öğe ve LocationID , öznitelik olarak.

  • The declare default element namespace is used in the XQuery prolog so that all the namespace declarations in the resulting XML appear at the top-level element.Bu sonuç daha okunaklı hale getirir.Varsayılan ad alanları hakkında daha fazla bilgi için bkz: XQuery içindeki Namespaces işleme.

Bu kısmi bir sonucudur:

<Step xmlns=
    "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"   
  LocationID="10">
     Insert <material>aluminum sheet MS-2341</material> into the <tool>T- 
     85A framing tool</tool>. 
</Step>
...
<Step xmlns=
      "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"   
    LocationID="20">
        Assemble all frame components following blueprint 
        <blueprint>1299</blueprint>.
</Step>
...

Order by yan tümcesi kullanarak

XQuery sıralama işlemi gerçekleştirildiğinde kullanarak order by yan tümce tümce tümcesinde flwor ifade.Sıralama ifadeler geçirilen order by yan tümce tümce tümce, türleri için geçerli değerleri dönmek gerekir gt işleç.Her sıralama ifade tek bir öğe başta sonuçlanması gerekir.Varsayılan olarak, sıralama, artan sırayla gerçekleştirilir.Artan veya azalan sırada sıralama her ifade için isteğe bağlı olarak belirtebilirsiniz.

Not

XQuery uygulamasında tarafından gerçekleştirilen dize değerleri karşılaştırmaları sıralama SQL Server her zaman gerçekleştirilen kullanarak ikili Unicode codepoint harmanlama.

AdditionalContactInfo gelen özel bir müşteri için telefon numaraları aşağıdaki sorgu alır sütun.Sonuçlar telefon numarasına göre sıralanır.

SELECT AdditionalContactInfo.query('
   declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
   declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
   for $a in /aci:AdditionalContactInfo//act:telephoneNumber 
   order by $a/act:number[1] descending
   return $a
') As Result
FROM Person.Person
WHERE BusinessEntityID = 293

Dikkat Atomization (XQuery) işlem Atomik değeri alır <number> ona geçirmeden önce öğeleri order by.ifade kullanarak Yazar data() işlev, ancak gerekli değildir.

order by data($a/act:number[1]) descending

Bu sonucu verir:

<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
  <act:number>333-333-3334</act:number>
</act:telephoneNumber>
<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
  <act:number>333-333-3333</act:number>
</act:telephoneNumber>

Ad sorgusu önsöz bildirmek yerine, bunları ile xmlnamespaces kullanarak bildirebilirsiniz.

WITH XMLNAMESPACES (
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo'  AS aci)

SELECT AdditionalContactInfo.query('
   for $a in /aci:AdditionalContactInfo//act:telephoneNumber 
   order by $a/act:number[1] descending
   return $a
') As Result
FROM Person.Person
WHERE BusinessEntityID = 293;

Öznitelik değerine göre de sıralama yapabilirsiniz.Örneğin, aşağıdaki sorgu yeni oluşturulan alır <Location> LocationID ve LaborHours öznitelikleri azalan sırada LaborHours öznitelik tarafından sıralanan öğeleriSonuç olarak, en yüksek işçilik saat sahip iş merkezi konumları ilk döndürülür.

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in /AWMI:root/AWMI:Location 
order by $WC/@LaborHours descending
        return
          <Location>
             { $WC/@LocationID } 
             { $WC/@LaborHours } 
          </Location>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7

Bu sonucu verir:

<Location LocationID="60" LaborHours="4"/>
<Location LocationID="50" LaborHours="3"/>
<Location LocationID="10" LaborHours="2.5"/>
<Location LocationID="20" LaborHours="1.75"/>
<Location LocationID="30" LaborHours="1"/>
<Location LocationID="45" LaborHours=".5"/>

Aşağıdaki sorgu sonuçlar öğe adına göre sıralanır.Sorgu, Ürün Kataloğu'ndan belirli bir ürün tarifleri alır.Alt özellikleri olan <Specifications> öğesi.

SELECT CatalogDescription.query('
     declare namespace
 pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
      for $a in /pd:ProductDescription/pd:Specifications/* 
     order by local-name($a)
      return $a
    ') as Result
FROM Production.ProductModel
where ProductModelID=19

Önceki sorgudan aşağıdakilere dikkat edin:

  • The /p1:ProductDescription/p1:Specifications/* expression returns element children of <Specifications>.

  • The order by (local-name($a)) expression sorts the sequence by the local part of the element name.

Bu sonucu verir:

<Color>Available in most colors</Color>
<Material>Almuminum Alloy</Material>
<ProductLine>Mountain bike</ProductLine>
<RiderExperience>Advanced to Professional riders</RiderExperience>
<Style>Unisex</Style>  

Sıralama ifade boş döndürür düğümler sırası başlangıcı için aşağıdaki örnekte gösterildiği gibi sıralanır:

declare @x xml
set @x='<root>
  <Person Name="A" />
  <Person />
  <Person Name="B" />
</root>
'
select @x.query('
  for $person in //Person
  order by $person/@Name
  return   $person
')

Bu sonucu verir:

<Person />
<Person Name="A" />
<Person Name="B" />

Aşağıdaki örnekte gösterildiği gibi birden fazla sıralama ölçütleri belirtebilirsiniz.Bu örnekte sorgu sıralar <Employee> öğeler başlığa göre önce ve sonra yönetici öznitelik değerleri.

declare @x xml
set @x='<root>
  <Employee ID="10" Title="Teacher"        Gender="M" />
  <Employee ID="15" Title="Teacher"  Gender="F" />
  <Employee ID="5" Title="Teacher"         Gender="M" />
  <Employee ID="11" Title="Teacher"        Gender="F" />
  <Employee ID="8" Title="Administrator"   Gender="M" />
  <Employee ID="4" Title="Administrator"   Gender="F" />
  <Employee ID="3" Title="Teacher"         Gender="F" />
  <Employee ID="125" Title="Administrator" Gender="F" /></root>'
SELECT @x.query('for $e in /root/Employee
order by $e/@Title ascending, $e/@Gender descending

  return
     $e
')

Bu sonucu verir:

<Employee ID="8" Title="Administrator" Gender="M" />
<Employee ID="4" Title="Administrator" Gender="F" />
<Employee ID="125" Title="Administrator" Gender="F" />
<Employee ID="10" Title="Teacher" Gender="M" />
<Employee ID="5" Title="Teacher" Gender="M" />
<Employee ID="11" Title="Teacher" Gender="F" />
<Employee ID="15" Title="Teacher" Gender="F" />
<Employee ID="3" Title="Teacher" Gender="F" />

Uygulama kısıtlamaları

Sınırlamalar şunlardır:

  • Sıralama ifadeler homogeneously yazılmalıdır.Bu statik olarak denetlenir.

  • Boş sıraları sıralama denetlenemez.

  • Boş en az, en büyük boş ve harmanlama anahtar üzerinde order by desteklenmez

Ayrıca bkz.

Kavramlar