Funkcje rozszerzenia XQuery — sql:variable()

Dotyczy:SQL Server

Ujawnia zmienną zawierającą wartość relacyjną SQL wewnątrz wyrażenia XQuery.

Syntax

  
sql:variable("variableName") as xdt:anyAtomicType?  

Remarks

Jak opisano w temacie Binding Relational Data Inside XML, możesz użyć tej funkcji, gdy używasz metod typów danych XML do udostępniania wartości relacyjnej w XQuery.

Na przykład metoda query() służy do określenia zapytania względem instancji XML przechowywanej w zmiennej lub kolumnie typu danych xml . Czasami możesz też chcieć, aby zapytanie używało wartości z zmiennej Transact-SQL lub parametru, aby połączyć dane relacyjne i XML. Aby to zrobić, używasz funkcji sql:variable .

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

Do instancji xml można odwołać się tylko w kontekście wyrażenia źródłowego instrukcji XML-DML insert; w przeciwnym razie nie można odwoływać się do wartości typu XML lub typów zdefiniowanych przez użytkownika w języku Common Language (CLR).

Examples

A. Wykorzystanie funkcji sql:variable() do przeniesienia wartości Transact-SQL zmiennej do XML

Poniższy przykład konstruuje instancję XML składającą się z następujących elementów:

  • Wartość (ProductID) z kolumny nie-XML. Funkcja sql:column() służy do powiązania tej wartości w XML.

  • Wartość (ListPrice) z kolumny nie-XML z innej tabeli. Ponownie, sql:column() jest używany do wiązania tej wartości w XML.

  • Wartość (DiscountPrice) z zmiennej Transact-SQL. Metoda ta sql:variable() służy do powiązania tej wartości z plikiem XML.

  • Wartość (ProductModelName) z kolumny typu xml , aby uczynić zapytanie ciekawszym.

Jest to zapytanie:

DECLARE @price money  
  
SET @price=2500.00  
SELECT ProductID, Production.ProductModel.ProductModelID,CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  
       <Product   
           ProductID="{ sql:column("Production.Product.ProductID") }"  
           ProductModelID= "{ sql:column("Production.Product.ProductModelID") }"  
           ProductModelName="{/pd:ProductDescription[1]/@ProductModelName }"  
           ListPrice="{ sql:column("Production.Product.ListPrice") }"  
           DiscountPrice="{ sql:variable("@price") }"  
        />')   
FROM Production.Product   
JOIN Production.ProductModel  
ON Production.Product.ProductModelID = Production.ProductModel.ProductModelID  
WHERE ProductID=771  

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

  • XQuery wewnątrz query() metody konstruuje XML.

  • Słowo namespace kluczowe służy do definiowania prefiksu przestrzeni nazw w Prologu XQuery. Dzieje się tak, ponieważ wartość atrybutu ProductModelName jest pobierana z kolumny CatalogDescription xml typu, która ma przypisany schemat.

Jest to wynik:

<Product ProductID="771" ProductModelID="19"   
         ProductModelName="Mountain 100"   
         ListPrice="3399.99" DiscountPrice="2500" />