XQuery-Erweiterungsfunktionen – sql:column()
Gilt für:SQL Server
Wie im Thema Bindung relationaler Daten innerhalb von XML beschrieben, können Sie die Funktion sql:column() verwenden, wenn Sie XML-Datentypmethoden verwenden, um einen relationalen Wert in XQuery verfügbar zu machen.
Beispielsweise wird die query()-Methode (XML-Datentyp) verwendet, um eine Abfrage für eine XML-Instanz anzugeben, die in einer Variablen oder Spalte des XML-Typs gespeichert ist. Manchmal kann es auch wünschenswert sein, dass eine Abfrage Werte aus einer anderen Nicht-XML-Spalte verwendet, um relationale und XML-Daten zu verbinden. Dazu verwenden Sie die Funktion sql:column().
Der SQL-Wert wird einem entsprechenden XQuery-Wert zugeordnet, und sein Typ ist ein XQuery-Basistyp, der dem entsprechenden SQL-Typ entspricht.
Syntax
sql:column("columnName")
Bemerkungen
Beachten Sie, dass der Verweis auf eine Spalte, die in der sql:column()- Funktion in einer XQuery angegeben ist, auf eine Spalte in der Zeile verweist, die verarbeitet wird.
In SQL Server können Sie nur auf eine xml-Instanz im Kontext des Quellausdrucks einer XML-DML-Insert-Anweisung verweisen. Andernfalls können Sie nicht auf Spalten vom Typ xml oder einen benutzerdefinierten CLR-Typ verweisen.
Die sql:column()- Funktion wird in JOIN-Vorgängen nicht unterstützt. Stattdessen kann der APPLY-Vorgang verwendet werden.
Beispiele
A. Abrufen des relationalen Werts in XML mit sql:column()
Beim Erstellen von XML veranschaulicht das folgende Beispiel, wie Sie Werte aus einer relationalen Nicht-XML-Spalte abrufen können, um XML und relationale Daten zu binden.
Die Abfrage erstellt XML in der folgenden Form:
<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
Beachten Sie im erstellten XML Folgendes:
Die Attributwerte ProductID, ProductName und ProductPrice werden aus der Tabelle Product abgerufen.
Der ProductModelID-Attributwert wird aus der ProductModel-Tabelle abgerufen.
Um die Abfrage interessanter zu machen, wird der ProductModelName-Attributwert aus der CatalogDescription-Spalte des xml-Typs abgerufen. Da die XML-Produktmodell-Kataloginformationen nicht für alle Produktmodelle gespeichert werden, wird die
if
-Anweisung nur zum Abrufen des Werts verwendet, wenn dieser vorhanden ist.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
Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:
Da die Werte aus zwei verschiedenen Tabellen abgerufen werden, gibt die FROM-Klausel zwei Tabellen an. Die Bedingung in der WHERE-Klausel filtert das Ergebnis und ruft nur Produkte ab, deren Produktmodelle über Katalogbeschreibungen verfügen.
Das Namespace-Schlüsselwort im XQuery-Prolog definiert das XML-Namespacepräfix "pd", das im Abfragetext verwendet wird. Beachten Sie, dass die Tabellenaliasse "P" und "PM" in der FROM-Klausel der Abfrage selbst definiert werden.
Die funktion sql:column() wird verwendet, um Nicht-XML-Werte in XML zu bringen.
Dies ist das Teilergebnis:
ProductID Result
-----------------------------------------------------------------
771 <Product ProductID="771" ProductName="Mountain-100 Silver, 38"
ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
...
Die folgende Abfrage erstellt XML, das produktspezifische Informationen enthält. Diese Informationen umfassen die Werte ProductID, ProductName, ProductPrice und, wenn verfügbar, ProductModelName für alle Produkte, die zu einem bestimmten Produktmodell, ProductModelID=19, gehören. Der XML-Code wird dann der @x Variablen des xml-Typs zugewiesen.
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
Weitere Informationen
XQuery-Erweiterungsfunktionen in SQL Server
Vergleichen von typisiertem XML mit nicht typisiertem XML
XML-Daten (SQL Server)
Erstellen von Instanzen der XML-Daten
xml Data Type Methods (xml-Datentypmethoden)
XML DML (Data Modification Language)