value() -Methode (XML-Datentyp)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Führt eine XQuery anhand von XML aus und gibt einen Wert vom SQL-Typ zurück. Diese Methode gibt einen Skalarwert zurück.
Sie verwenden diese Methode üblicherweise, um einen Wert aus einer XML-Instanz zu extrahieren, die in einer Spalte, einem Parameter oder einer Variablen des xml -Datentyps gespeichert ist. Auf diese Weise können Sie Abfragen angeben SELECT
, die XML-Daten mit Daten in Nicht-XML-Spalten kombinieren oder vergleichen.
Syntax
value ( XQuery , SQLType )
Argumente
XQuery
Der XQuery-Ausdruck , ein Zeichenfolgenliteral, das Daten innerhalb der XML-Instanz abruft. Die XQuery muss mindestens einen Wert zurückgeben. Ansonsten wird ein Fehler zurückgegeben.
SQLType
Der bevorzugte SQL-Typ, ein Zeichenfolgenliteral, das zurückgegeben werden soll. Der Rückgabetyp dieser Methode entspricht dem SQLType -Parameter. SQLType kann ein benutzerdefinierter SQL-Datentyp sein.
Hinweis
SQLType kann keine der folgenden Datentypen sein: XML, Bild, Text, ntext, sql_variant oder ein benutzerdefinierter Typ für die Common Language Runtime (CLR).
Die value()
Methode verwendet implizit den Transact-SQL-Operator CONVERT
. value()
versucht, das Ergebnis des XQuery-Ausdrucks, der serialisierten Zeichenfolgendarstellung, vom XML-Schemadefinitionstyp (XSD) in den entsprechenden SQL-Typ zu konvertieren, der durch Transact-SQL-Konvertierung angegeben wird. Weitere Informationen zu Typ casting rules for CONVERT
, see CAST and CONVERT.
Aus Leistungsgründen können Sie anstelle der value()
Methode in einem Prädikat verwenden exist()
sql:column()
, um mit einem relationalen Wert zu vergleichen. Dieses exist()
Beispiel wird weiter unten in diesem Artikel gezeigt.
Beispiele
Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.
A. Verwenden der Value()-Methode für eine XML-Typvariable
Im folgenden Beispiel wird eine XML-Instanz in einer Variablen vom XML-Typ gespeichert. Mit der value()
-Methode wird der Wert des ProductID
-Attributs aus der XML-Instanz abgerufen. Der Wert wird dann einer Int-Variable zugewiesen.
DECLARE @myDoc XML;
DECLARE @ProdID INT;
SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>';
SET @ProdID = @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int');
SELECT @ProdID;
Ein Wert von 1
wird als Ergebnis zurückgegeben.
Obwohl in der XML-Instanz nur ein ProductID
Attribut vorhanden ist, müssen Sie bei statischen Eingaberegeln explizit angeben, dass der Pfadausdruck ein Singleton zurückgibt. Daher wird das [1]
Ende des Pfadausdrucks hinzugefügt. Weitere Informationen zur statischen Typisierung finden Sie unter XQuery and statische Typisierung.
B. Verwenden der Value()-Methode zum Abrufen eines ganzzahligen Werts aus einer XML-Typspalte
Die folgende Abfrage wird für eine Spalte vom Typ xml (CatalogDescription
) in der AdventureWorks2022
-Datenbank angegeben. Die Abfrage ruft die Werte des Attributs ProductModelID
aus jeder in der Spalte gespeicherten XML-Instanz ab.
SELECT CatalogDescription.value(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
(/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;
Hinweis aus der vorherigen Abfrage:
Das
namespace
-Schlüsselwort wird verwendet, um ein Namespacepräfix zu definieren.Gemäß den Anforderungen der statischen Typisierung wird
[1]
am Ende des Pfadausdrucks in dervalue()
-Methode hinzugefügt, um explizit anzugeben, dass der Pfadausdruck ein Singleton zurückgibt.
Hier sehen Sie das Ergebnis.
35
34
28
25
23
19
C. Verwenden der Value()-Methode zum Abrufen eines Zeichenfolgenwerts aus einer XML-Typspalte
Die folgende Abfrage wird für die XML-Typspalte (CatalogDescription
) in der AdventureWorks2022
Datenbank angegeben. Die Abfrage ruft die Werte des Attributs ProductModelName
aus jeder in der Spalte gespeicherten XML-Instanz ab.
SELECT CatalogDescription.value(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(50)') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;
Hinweis aus der vorherigen Abfrage:
Das
namespace
-Schlüsselwort wird verwendet, um ein Namespacepräfix zu definieren.Gemäß den Anforderungen der statischen Typisierung wird
[1]
am Ende des Pfadausdrucks in dervalue()
-Methode hinzugefügt, um explizit anzugeben, dass der Pfadausdruck ein Singleton zurückgibt.
Hier sehen Sie das Ergebnis.
Touring-2000
Touring-1000
Road-450
Road-150
Mountain-500
Mountain 100
D: Verwenden Sie die Methoden value() und exist() zum Abrufen von Werten aus einer XML-Typspalte.
Das folgende Beispiel veranschaulicht die Verwendung der beiden Methoden value()
und exist() des XML-Datentyps. Die value()
-Methode wird zum Abrufen von ProductModelID
-Attributwerten aus der XML-Instanz verwendet. Mit der exist()
-Methode in der WHERE
-Klausel werden die Zeilen aus der Tabelle gefiltert.
Mit der Abfrage werden Produktmodell-IDs aus XML-Instanzen mit Garantieinformationen (<Warranty>
-Element) als eine der Features abgerufen. Die Bedingung in der WHERE
-Klausel verwendet die exist()
-Methode, um nur solche Zeilen abzurufen, die diese Bedingung erfüllen.
SELECT CatalogDescription.value(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
(/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
/PD:ProductDescription/PD:Features/wm:Warranty') = 1;
Hinweis aus der vorherigen Abfrage:
Die
CatalogDescription
-Spalte ist eine typisierte XML-Spalte. Das bedeutet, dass ihr eine Schemaauflistung zugeordnet ist. In den Modulen und Prologs – XQuery Prolog wird die Namespacedeklaration verwendet, um das Präfix zu definieren, das später im Abfragetext verwendet wird.Wenn die
exist()
Methode zurückgibt1
(true), gibt sie an, dass die XML-Instanz das<Warranty>
untergeordnete Element als eines der Features enthält.Die
value()
-Methode in derSELECT
-Klausel ruft dann dieProductModelID
-Attributwerte als ganze Zahlen ab.
Hier ist das Teilergebnis:
19
23
...
E. Verwenden Sie die exist()-Methode anstelle der Value()-Methode.
Aus Leistungsgründen sollten Sie zum Vergleichen mit einem relationalen Wert die value()
-Methode mit exist()
verwenden und nicht die sql:column()
-Methode in einem Prädikat. Zum Beispiel:
CREATE TABLE T (c1 INT, c2 VARCHAR(10), c3 XML);
GO
SELECT c1, c2, c3
FROM T
WHERE c3.value('(/root/@a)[1]', 'integer') = c1;
GO
Dieser Code kann wie folgt umgeschrieben werden:
SELECT c1, c2, c3
FROM T
WHERE c3.exist('/root[@a=sql:column("c1")]') = 1;
GO