Primärausdrücke (XQuery)
Gilt für:SQL Server
Die XQuery-Primärausdrücke umfassen Literale, Variablenverweise, Kontextelementausdrücke, Konstruktoren und Funktionsaufrufe.
Literale
XQuery-Literale können numerische oder Zeichenfolgenliterale sein. Ein Zeichenfolgenliteral kann vordefinierte Entitätsverweise enthalten; ein Entitätsverweis ist eine Abfolge von Zeichen. Die Abfolge beginnt mit einem kaufmännischen Und-Zeichen, das ein einzelnes Zeichen darstellt, das anderenfalls syntaktische Signifikanz besitzen könnte. Darauf folgen die vordefinierten Entitätsverweise für XQuery.
Entitätsverweis | repräsentiert |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
Ein Zeichenfolgenliteral kann auch einen Zeichenverweis enthalten, einen Verweis im XML-Stil auf ein Unicode-Zeichen, das durch seinen dezimalen oder hexadezimalen Codepunkt identifiziert wird. Das Euro-Symbol kann beispielsweise durch den Zeichenverweis "€" dargestellt werden.
Hinweis
SQL Server verwendet XML-Version 1.0 als Grundlage für die Analyse.
Beispiele
Die folgenden Beispiele veranschaulichen die Verwendung von Literalen sowie Entitäts- und Zeichenverweisen.
Dieser Code gibt einen Fehler zurück, weil die Zeichen <'
und '>
eine besondere Bedeutung besitzen.
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO
Wenn Sie stattdessen einen Entitätsverweis verwenden, funktioniert die Abfrage:
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO
Das folgende Beispiel zeigt die Verwendung eines Zeichenverweises zur Darstellung des Euro-Symbols.
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <a>€12.50</a>')
Dies ist das Ergebnis.
<a>€12.50</a>
Im folgenden Beispiel wird die Abfrage durch Apostrophe getrennt. Daher wird der Apostroph im Zeichenfolgenwert durch zwei aufeinanderfolgende Apostrophe dargestellt.
DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>I don''t know</a>')
Go
Dies ist das Ergebnis.
<a>I don't know</a>
Die integrierten booleschen Funktionen true() und false() können verwendet werden, um boolesche Werte darzustellen, wie im folgenden Beispiel gezeigt.
DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>{true()}</a>')
GO
Der direkte Elementkonstruktor gibt einen Ausdruck in geschweiften Klammern an. Dieser wird durch seinen Wert im sich ergebenden XML ersetzt.
Dies ist das Ergebnis.
<a>true</a>
Variablenverweise
Ein Variablenverweis in XQuery ist ein QName, dem ein $-Zeichen vorangestellt wurde. Diese Implementierung unterstützt nur Variablenverweise ohne Präfix. Die folgende Abfrage definiert z. B. die Variable $i
im FLWOR-Ausdruck:
DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
for $i in /root return data($i)')
GO
Die folgende Abfrage funktioniert nicht, weil dem Variablennamen ein Namespacepräfix hinzugefügt wurde.
DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
DECLARE namespace x="https://X";
for $x:i in /root return data($x:i)')
GO
Sie können die Erweiterungsfunktion sql:variable() verwenden, um auf SQL-Variablen zu verweisen, wie in der folgenden Abfrage gezeigt.
DECLARE @price money
SET @price=2500
DECLARE @x xml
SET @x = ''
SELECT @x.query('<value>{sql:variable("@price") }</value>')
Dies ist das Ergebnis.
<value>2500</value>
Implementierungseinschränkungen
Die folgenden Implementierungseinschränkungen sind zu beachten:
Variablen mit Namespacepräfixen werden nicht unterstützt.
Modulimport wird nicht unterstützt.
Externe Variablendeklarationen werden nicht unterstützt. Eine Lösung hierfür ist die Verwendung der Funktion sql:variable().
Kontextelementausdrücke
Das Kontextelement ist das Element, das aktuell im Kontext eines path-Ausdrucks verarbeitet wird. Es wird in einer XML-Datentypinstanz ungleich NULL mit dem Dokumentknoten initialisiert. Sie kann auch von der nodes()-Methode im Kontext von XPath-Ausdrücken oder den []-Prädikaten geändert werden.
Das Kontextelement wird von einem Ausdruck zurückgegeben, der einen Punkt (.) enthält. Die folgende Abfrage wertet beispielsweise jedes Element <a
> auf das Vorhandensein des Attributs attr
aus. Wenn das Attribut vorhanden ist, wird das Element zurückgegeben. Beachten Sie, dass die Bedingung im Prädikat angibt, dass der Kontextknoten durch einen einzelnen Punkt angegeben wird.
DECLARE @var XML
SET @var = '<ROOT>
<a>1</a>
<a attr="1">2</a>
</ROOT>'
SELECT @var.query('/ROOT[1]/a[./@attr]')
Dies ist das Ergebnis.
<a attr="1">2</a>
Funktionsaufrufe
Sie können integrierte XQuery-Funktionen und die SQL Server funktionen sql:variable() und sql:column() aufrufen. Eine Liste der implementierten Funktionen finden Sie unter XQuery Functions für den xml-Datentyp.
Implementierungseinschränkungen
Die folgenden Implementierungseinschränkungen sind zu beachten:
Funktionsdeklaration im XQuery-Prolog wird nicht unterstützt.
Funktionsimport wird nicht unterstützt.