Modüller ve Prologlar - XQuery Prolog

Şunlar için geçerlidir: SQL Server

Bir XQuery sorgusu bir prolog ve bir gövdeden oluşur. XQuery prologu, sorgu işleme için gerekli ortamı birlikte oluşturan bir dizi bildiri ve tanımdır. SQL Server'da, XQuery prologu isim alanı bildirimlerini içerebilir. XQuery gövdesi, amaçlanan sorgu sonucunu belirten bir dizi ifade dizisinden oluşur.

Örneğin, aşağıdaki XQuery, üretim komutlarını XML olarak depolayan xml tipli Talimatlar sütununa karşı belirtilir. Sorgu, iş merkezi konumunun 10üretim talimatlarını alır. query() xml veri tipi yöntemi XQuery'yi belirtmek için kullanılır.

SELECT Instructions.query('declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";           
    /AWMI:root/AWMI:Location[@LocationID=10]  
') AS Result   
FROM  Production.ProductModel  
WHERE ProductModelID=7  

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

  • XQuery prologunda bir namespace prefix (AWMI) beyanı bulunur, (namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";.

  • Anahtar kelime, declare namespace sorgu gövdesinde daha sonra kullanılan bir namespace önekini tanımlar.

  • /AWMI:root/AWMI:Location[@LocationID="10"] sorgu gövdesidir.

Ad Alanı Bildirimleri

Bir namespace bildiresi, bir preek tanımlar ve aşağıdaki sorguda gösterildiği gibi bir namespace URI ile ilişkilendirir. Sorguda, CatalogDescriptionxml tipi bir sütun vardır.

XQuery'yi bu sütuna göre belirtirken, sorgu prologu önek, ürün tanımını, isim alanı URI'sine bağlamak PDiçin bildirmeyi belirtirdeclare namespace. Bu ön ek, isim alanı URI'si yerine sorgu gövdesinde kullanılır. Ortaya çıkan XML'deki düğümler, isim alanı URI'si ile ilişkili isim uzayındadır.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
         /PD:ProductDescription/PD:Summary   
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Sorgu okunabilirliğini artırmak için, sorgu prologunda önek ve namespace bağlama ilan etmek yerine WITH XMLNAMESPACES ile namespace'leri ilan edebilirsiniz.declare namespace

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)  
  
SELECT CatalogDescription.query('  
         /PD:ProductDescription/PD:Summary   
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Daha fazla bilgi için bkz. Add Namespaces with XMLNAMESPACES ile Sorgulara Namespaces.

Varsayılan İsim Alanı Bildirisi

Declaration kullanılarak bir namespace preeki declare namespace ilan etmek yerine, declaration'i declare default element namespace eleman isimleri için varsayılan bir isim alanını bağlamak için kullanabilirsin. Bu durumda herhangi bir ön ek belirtmiyorsunuz.

Aşağıdaki örnekte, sorgu gövdesindeki yol ifadesi bir isim alanı öneki belirtmez. Varsayılan olarak, tüm eleman adları prologda belirtilen varsayılan isim alanına aittir.

SELECT CatalogDescription.query('  
     declare default element namespace  "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
        /ProductDescription/Summary   
    ') as Result  
FROM  Production.ProductModel  
WHERE ProductModelID=19   

Varsayılan bir isim alanı ilan ederek WITH XMLNAMESPACES kullanabilirsiniz:

WITH XMLNAMESPACES (DEFAULT 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription')  
SELECT CatalogDescription.query('  
        /ProductDescription/Summary   
    ') as Result  
FROM  Production.ProductModel  
WHERE ProductModelID=19