Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Exponerar en variabel som innehåller ett SQL-relationsvärde inuti ett XQuery-uttryck.
Syntax
sql:variable("variableName") as xdt:anyAtomicType?
Remarks
Som beskrivs i ämnet Binding Relational Data Inside XML kan du använda denna funktion när du använder XML-datatypmetoder för att exponera ett relationsvärde i XQuery.
Till exempel används query()-metoden för att specificera en fråga mot en XML-instans som lagras i en xml-datatypvariabel eller kolumn. Ibland vill du också att din fråga ska använda värden från en Transact-SQL variabel eller parameter för att sammanföra relations- och XML-data. För att göra detta använder du sql:variable-funktionen .
SQL-värdet mappas till ett motsvarande XQuery-värde och dess typ är en XQuery-bastyp som motsvarar motsvarande SQL-typ.
Du kan endast hänvisa till en xml-instans i kontexten av källuttrycket för en XML-DML insert-sats; annars kan du inte referera till värden av typen xml eller en användardefinierad användardefinierad typ av Common Language Runtime (CLR).
Examples
A. Att använda sql:variable()-funktionen för att ta in ett Transact-SQL variabelvärde i XML
Följande exempel konstruerar en XML-instans som består av följande:
Ett värde (
ProductID) från en icke-XML-kolumn. sql:column()-funktionen används för att binda detta värde i XML:en.Ett värde (
ListPrice) från en icke-XML-kolumn från en annan tabell. Återigensql:column()används för att binda detta värde i XML.Ett värde (
DiscountPrice) från en Transact-SQL variabel. Metodensql:variable()används för att binda detta värde i XML:en.Ett värde (
ProductModelName) från en xml-typkolumn , för att göra frågan mer intressant.
Det här är frågan:
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
Observera följande från föregående fråga:
XQuery inuti
query()metoden konstruerar XML:en.Nyckelordet
namespaceanvänds för att definiera ett namnrymdsprefix i XQuery-prologen. Detta görs eftersomProductModelNameattributvärdet hämtas från typkolumnenCatalogDescription xml, som har ett schema kopplat till sig.
Det här är resultatet:
<Product ProductID="771" ProductModelID="19"
ProductModelName="Mountain 100"
ListPrice="3399.99" DiscountPrice="2500" />