Einbinden relationaler Daten in XML-Daten
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz
Sie können XML-Datentypmethoden für eine XML-Datentypvariable oder -spalte angeben. So führt die query()-Methode (Abfragemethode) (XML-Datentyp) beispielsweise die angegebene XQuery für eine XML-Instanz aus. Beim Erstellen von XML-Code auf diese Art sollten Sie einen Wert aus einer Nicht-XML-Typspalte oder eine Transact-SQL-Variable einbringen. Dieser Prozess wird als Einbinden relationaler Daten in XML bezeichnet.
Um relationale Nicht-XML-Daten in XML zu binden, bietet die SQL Server-Datenbank-Engine folgende Pseudofunktionen:
Mithilfe der sql:column()-Funktion (XQuery) können Sie die Werte aus einer relationalen Spalte in Ihrem XQuery- oder XML DML-Ausdruck verwenden.
sql:variable() Function (XQuery) . Gibt Ihnen die Möglichkeit, den Wert einer SQL-Variablen im XQuery- oder XML DML-Ausdruck zu verwenden.
Sie können diese Funktionen jedes Mal mit XML-Datentypmethoden verwenden, wenn Sie einen relationalen Wert in XML verfügbar machen möchten.
Diese Funktionen können nicht für den Verweis auf Daten in Spalten oder Variablen der benutzerdefinierten CLR-Typen des Datentyps XML sowie der Typen datetime, smalldatetime, text, ntext, sql_variant und image verwendet werden.
Das Einbinden ist außerdem nur zur Leseberechtigung. Deshalb können Sie in Spalten keine Daten schreiben, die diese Funktion verwenden. Zum Beispiel ist sql:variable("@x")="some expression" nicht zulässig.
Beispiel: Domänenübergreifende Abfrage mithilfe von sql:variable()
In diesem Beispiel wird gezeigt, wie eine Anwendung mit sql:variable() eine Abfrage parametrisieren kann. Die ISBN wird mit der SQL-Variablen @isbn übergeben. Durch Ersetzen der Konstante durch sql:variable() kann die Abfrage für die Suche nach einer beliebigen ISBN verwendet werden, nicht nur für die Suche nach der ISBN 0-7356-1588-2.
DECLARE @isbn VARCHAR(20)
SET @isbn = '0-7356-1588-2'
SELECT xCol
FROM T
WHERE xCol.exist ('/book/@ISBN[. = sql:variable("@isbn")]') = 1
sql:column() kann auf ähnliche Weise verwendet werden und bietet weitere Vorteile. Indizes für die Spalte können aus Effizienzgründen verwendet werden, was durch den kostenbasierten Abfrageoptimierer entschieden wird. Außerdem kann die berechnete Spalte zum Speichern einer heraufgestuften Eigenschaft verwendet werden.