Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Wie im Thema beschrieben, können Sie die Sql:column(()-Funktion 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 Datentyp ist ein XQuery-Basistyp, der mit dem entsprechenden SQL-Typ äquivalent ist.
Syntax
sql:column("columnName")
Hinweise
Beachten Sie, dass sich der Verweis auf eine in der sql:column() -Funktion innerhalb einer XQuery-Funktion angegebene Spalte auf eine Spalte in der Zeile bezieht, die verarbeitet wird.
In SQL Server können Sie nur im Kontext des Quellausdrucks einer XML-DML-Insert-Anweisung auf eine XML-Instanz verweisen. Andernfalls können Sie nicht auf Spalten verweisen, die vom Typ XML oder einem benutzerdefinierten CLR-Typ sind.
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()
Das folgende Beispiel zeigt beim Erstellen von XML, wie Werte aus einer relationalen Nicht-XML-Spalte abgerufen werden, 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 Tabelle "ProductModel " abgerufen.
Um die Abfrage interessanter zu gestalten, 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 Sql:column() -Funktion wird verwendet, um Nicht-XML-Werte in XML zu verwenden.
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
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)