Aracılığıyla paylaş


XQuery Uzantı İşlevleri - sql:column()

Şunlar için geçerlidir: SQL Server

XML İçinde İlişkisel Verileri Bağlama konusunda açıklandığı gibi, XQuery içinde ilişkisel bir değeri kullanıma açmak için XML Veri Türü Yöntemlerini kullanırken sql:column(() işlevini kullanabilirsiniz.

Örneğin, query() yöntemi (XML veri türü),xml türünde bir değişkende veya sütunda depolanan bir XML örneğine karşı sorgu belirtmek için kullanılır. Bazen, ilişkisel ve XML verilerini bir araya getirmek için sorgunuzun xml olmayan başka bir sütundaki değerleri kullanmasını da isteyebilirsiniz. Bunu yapmak için sql:column() işlevini kullanırsınız.

SQL değeri karşılık gelen bir XQuery değerine eşlenir ve türü ilgili SQL türüne eşdeğer bir XQuery temel türü olur.

Sözdizimi

  
sql:column("columnName")  

Açıklamalar

XQuery içindeki sql:column() işlevinde belirtilen bir sütuna yapılan başvurunun, işlenen satırdaki bir sütuna başvurduğunu unutmayın.

SQL Server'da bir xml örneğine yalnızca XML-DML insert deyiminin kaynak ifadesi bağlamında başvurabilirsiniz; aksi takdirde , xml veya CLR kullanıcı tanımlı türünde sütunlara başvuramazsınız.

sql:column() işlevi JOIN işlemlerinde desteklenmez. Bunun yerine APPLY işlemi kullanılabilir.

Örnekler

A. XML içindeki ilişkisel değeri almak için sql:column() kullanma

XML oluşturmada, aşağıdaki örnekte XML ve ilişkisel verileri bağlamak için XML olmayan bir ilişkisel sütundan değerleri nasıl alabildiğiniz gösterilmektedir.

Sorgu, aşağıdaki forma sahip XML oluşturur:

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"   
  ProductModelName="Mountain 100" />  

Oluşturulan XML'de aşağıdakilere dikkat edin:

  • ProductID, ProductName ve ProductPrice öznitelik değerleri Product tablosundan alınır.

  • ProductModelID öznitelik değeri ProductModel tablosundan alınır.

  • Sorguyu daha ilginç hale getirmek için ProductModelName öznitelik değeri xml türündekiCatalogDescription sütunundan alınır. XML ürün modeli katalog bilgileri tüm ürün modelleri için depolanmadığından, if deyimi değeri yalnızca varsa almak için kullanılır.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           <Product   
               ProductID=       "{ sql:column("P.ProductID") }"  
               ProductName=     "{ sql:column("P.Name") }"  
               ProductPrice=    "{ sql:column("P.ListPrice") }"  
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
               { if (not(empty(/pd:ProductDescription))) then  
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
                else   
                   ()  
    }  
            </Product>  
    ') as Result  
    FROM Production.ProductModel PM, Production.Product P  
    WHERE PM.ProductModelID = P.ProductModelID  
    AND   CatalogDescription is not NULL  
    ORDER By PM.ProductModelID  
    

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

  • Değerler iki farklı tablodan alındığından FROM yan tümcesi iki tabloyu belirtir. WHERE yan tümcesindeki koşul sonucu filtreler ve yalnızca ürün modellerinde katalog açıklamaları olan ürünleri alır.

  • XQuery Prolog'dakinamespace anahtar sözcüğü, sorgu gövdesinde kullanılan "pd" XML ad alanı ön ekini tanımlar. "P" ve "PM" tablo diğer adlarının sorgunun FROM yan tümcesinde tanımlandığını unutmayın.

  • sql:column() işlevi XML olmayan değerleri XML içine getirmek için kullanılır.

Kısmi sonuç şu şekildedir:

ProductID               Result  
-----------------------------------------------------------------  
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38"   
                  ProductPrice="3399.99" ProductModelID="19"   
                  ProductModelName="Mountain 100" />  
...  

Aşağıdaki sorgu, ürüne özgü bilgiler içeren XML oluşturur. Bu bilgiler, belirli bir ürün modeli olan ProductModelID=19'a ait tüm ürünler için ProductID, ProductName, ProductPrice ve varsa ProductModelName bilgilerini içerir. Xml daha sonra xml türü değişkenine @x atanır.

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <Product   
           ProductID=       "{ sql:column("P.ProductID") }"  
           ProductName=     "{ sql:column("P.Name") }"  
           ProductPrice=    "{ sql:column("P.ListPrice") }"  
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
           { if (not(empty(/pd:ProductDescription))) then  
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
            else   
               ()  
}  
        </Product>  
')   
FROM Production.ProductModel PM, Production.Product P  
WHERE PM.ProductModelID = P.ProductModelID  
And P.ProductModelID = 19  
select @x  

Ayrıca Bkz.

Türü Yazılan XML'i Yazılmamış XML ile Karşılaştırma
XML Verileri (SQL Server)
XML Verilerinin Örneklerini Oluşturma
xml Veri Türü Yöntemleri
XML Veri Değiştirme Dili (XML DML)