Udostępnij za pomocą


Funkcje rozszerzenia XQuery — sql:column()

Dotyczy:programu SQL Server

Zgodnie z opisem w temacie wiązanie danych relacyjnych wewnątrzXML, można użyć funkcji sql:column(() podczas używania metod typów danych XML uwidaczniać wartość relacyjną wewnątrz biblioteki XQuery.

Na przykład metoda query() (typ danych XML) służy do określania zapytania względem wystąpienia XML przechowywanego w zmiennej lub kolumnie typu xml. Czasami możesz również chcieć, aby zapytanie używało wartości z innej kolumny, innej niż XML, aby połączyć dane relacyjne i XML. W tym celu należy użyć funkcji sql:column().

Wartość SQL zostanie zamapowana na odpowiadającą wartość XQuery, a jej typ będzie typem podstawowym XQuery, który jest odpowiednikiem odpowiedniego typu SQL.

Składnia

  
sql:column("columnName")  

Uwagi

Należy pamiętać, że odwołanie do kolumny określonej w sql:column() funkcji wewnątrz zapytania XQuery odnosi się do kolumny w przetwarzanym wierszu.

W programie SQL Server można odwoływać się tylko do wystąpienia xml w kontekście wyrażenia źródłowego instrukcji insert XML-DML; W przeciwnym razie nie można odwoływać się do kolumn typu xml lub typu zdefiniowanego przez użytkownika CLR.

Funkcja sql:column() nie jest obsługiwana w operacjach JOIN. Zamiast tego można użyć operacji APPLY.

Przykłady

A. Pobieranie wartości relacyjnej wewnątrz pliku XML przy użyciu metody sql:column()

W konstruowaniu kodu XML poniższy przykład ilustruje sposób pobierania wartości z kolumny relacyjnej innej niż XML w celu powiązania danych XML i relacyjnych.

Zapytanie konstruuje kod XML, który ma następujący formularz:

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

Zwróć uwagę na następujące elementy w skonstruowanym pliku XML:

  • Wartości atrybutów ProductID, ProductNamei ProductPrice są uzyskiwane z tabeli produktu.

  • Wartość atrybutu ProductModelID jest pobierana z tabeli ProductModel.

  • Aby zapytanie było bardziej interesujące, wartość atrybutu ProductModelName jest uzyskiwana z kolumny CatalogDescription typu xml . Ponieważ informacje o wykazie modeli produktów XML nie są przechowywane dla wszystkich modeli produktów, instrukcja if służy do pobierania wartości tylko wtedy, gdy istnieje.

    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  
    

Zwróć uwagę na następujące elementy z poprzedniego zapytania:

  • Ponieważ wartości są pobierane z dwóch różnych tabel, klauzula FROM określa dwie tabele. Warunek w klauzuli WHERE filtruje wynik i pobiera tylko produkty, których modele produktów mają opisy katalogu.

  • przestrzeni nazw słowo kluczowe w XQuery Prolog definiuje prefiks przestrzeni nazw XML "pd", który jest używany w treści zapytania. Pamiętaj, że aliasy tabeli , "P" i "PM" są zdefiniowane w klauzuli FROM samego zapytania.

  • Funkcja sql:column() służy do stosowania wartości innych niż XML wewnątrz kodu XML.

Jest to wynik częściowy:

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

Poniższe zapytanie konstruuje kod XML zawierający informacje specyficzne dla produktu. Te informacje obejmują wartości ProductID, ProductName, ProductPrice i, jeśli są dostępne, ProductModelName dla wszystkich produktów należących do określonego modelu produktu ProductModelID=19. Kod XML jest następnie przypisywany do zmiennej @x typu xml.

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  

Zobacz też

porównaj typizowane dane XML z nietypowych XML
danych XML (SQL Server)
tworzenie wystąpień danych XML
metody typów danych xml
języka modyfikacji danych XML (XML DML)