Anteckning
Å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
Som beskrivs i avsnittet Bind relationsdata inuti XML kan du använda funktionen sql:column(() när du använder XML-datatypsmetoder för att exponera ett relationsvärde i XQuery.
Metoden query() (XML-datatyp) används till exempel för att ange en fråga mot en XML-instans som lagras i en variabel eller kolumn av XML-typ . Ibland kanske du också vill att frågan ska använda värden från en annan, icke-XML-kolumn, för att sammanföra relations- och XML-data. För att göra detta använder du funktionen sql:column().
SQL-värdet mappas till ett motsvarande XQuery-värde och dess typ är en XQuery-bastyp som motsvarar motsvarande SQL-typ.
Syntax
sql:column("columnName")
Anmärkningar
Observera att referensen till en kolumn som anges i funktionen sql:column() i en XQuery refererar till en kolumn i raden som bearbetas.
I SQL Server kan du bara referera till en XML-instans i kontexten för källuttrycket för en XML-DML insert-instruktion; Annars kan du inte referera till kolumner som är av typen XML eller en CLR-användardefinierad typ.
Funktionen sql:column() stöds inte i JOIN-åtgärder. Apply-åtgärden kan användas i stället.
Examples
A. Använda sql:column() för att hämta relationsvärdet i XML
När du skapar XML illustrerar följande exempel hur du kan hämta värden från en relationskolumn som inte är XML för att binda XML- och relationsdata.
Frågan konstruerar XML som har följande formulär:
<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
Observera följande i den konstruerade XML:en:
Attributvärdena ProductID, ProductName och ProductPrice hämtas från tabellen Produkt .
Attributet ProductModelID hämtas från tabellen ProductModel .
För att göra frågan mer intressant hämtas attributet ProductModelName från kolumnen CatalogDescription av xml-typ. Eftersom kataloginformationen för XML-produktmodellen inte lagras för alla produktmodeller används -instruktionen
ifendast för att hämta värdet om det finns.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
Observera följande från föregående fråga:
Eftersom värdena hämtas från två olika tabeller anger FROM-satsen två tabeller. Villkoret i WHERE-satsen filtrerar resultatet och hämtar endast produkter vars produktmodeller har katalogbeskrivningar.
Nyckelordet för namnområdet i XQuery Prolog definierar XML-namnområdesprefixet "pd", som används i frågetexten. Observera att tabellalias, "P" och "PM", definieras i FROM-satsen för själva frågan.
Funktionen sql:column() används för att ta in icke-XML-värden i XML.
Detta är det partiella resultatet:
ProductID Result
-----------------------------------------------------------------
771 <Product ProductID="771" ProductName="Mountain-100 Silver, 38"
ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
...
Följande fråga konstruerar XML som innehåller produktspecifik information. Den här informationen omfattar ProductID, ProductName, ProductPrice och, om tillgängligt, ProductModelName för alla produkter som tillhör en specifik produktmodell, ProductModelID=19. XML-koden tilldelas sedan till variabeln @x av xml-typ .
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
Se även
Jämför typerad XML med otypad XML
XML-data (SQL Server)
Skapa instanser av XML-data
xml-datatypsmetoder
XML-datamodifieringsspråk (XML DML)