value()-Methode (xml-Datentyp)value() Method (xml Data Type)

GILT FÜR: jaSQL ServerjaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Führt eine XQuery-Abfrage für den XML-Code aus und gibt einen Wert im SQL-Typ zurück.Performs an XQuery against the XML and returns a value of SQL type. Diese Methode gibt einen Skalarwert zurück.This method returns a scalar value.

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.You typically use this method to extract a value from an XML instance stored in an xml type column, parameter, or variable. Auf diese Weise können Sie SELECT-Abfragen angeben, die XML-Daten mit Daten in Nicht-XML-Spalten kombinieren oder vergleichen.In this way, you can specify SELECT queries that combine or compare XML data with data in non-XML columns.

SyntaxSyntax

  
value (XQuery, SQLType)  

ArgumenteArguments

XQueryXQuery
Ist der XQuery -Ausdruck (ein Zeichenfolgenliteral), der Daten innerhalb der XML-Instanz abruft.Is the XQuery expression, a string literal, that retrieves data inside the XML instance. Die XQuery muss mindestens einen Wert zurückgeben.The XQuery must return at most one value. Ansonsten wird ein Fehler zurückgegeben.Otherwise, an error is returned.

SQLTypeSQLType
Ist der bevorzugte SQL-Typ (ein Zeichenfolgenliteral), der zurückgegeben werden soll.Is the preferred SQL type, a string literal, to be returned. Der Rückgabetyp dieser Methode entspricht dem SQLType -Parameter.The return type of this method matches the SQLType parameter. SQLType kann kein xml -Datentyp, benutzerdefinierter CLR-Typ (Common Language Runtime) sowie kein image-, text-, ntext- oder sql_variant -Datentyp sein.SQLType cannot be an xml data type, a common language runtime (CLR) user-defined type, image, text, ntext, or sql_variant data type. SQLType kann ein benutzerdefinierter SQL-Datentyp sein.SQLType can be an SQL, user-defined data type.

Die value() -Methode verwendet implizit den Transact-SQLTransact-SQL-Operator CONVERT und versucht, das Ergebnis des XQuery-Ausdrucks (die serialisierte Zeichenfolgendarstellung) vom XSD-Typ in den entsprechenden SQL-Typ zu konvertieren, der durch die Transact-SQLTransact-SQL-Konvertierung angegeben wird.The value() method uses the Transact-SQLTransact-SQL CONVERT operator implicitly and tries to convert the result of the XQuery expression, the serialized string representation, from XSD type to the corresponding SQL type specified by Transact-SQLTransact-SQL conversion. Weitere Informationen zu Regeln für die Typumwandlung für CONVERT finden Sie unter CAST und CONVERT (Transact-SQL).For more information about type casting rules for CONVERT, see CAST and CONVERT (Transact-SQL).

Hinweis

Aus Leistungsgründen sollten Sie zum Vergleichen mit einem relationalen Wert die exist() -Methode mit sql:column() verwenden und nicht die value() -Methode in einem Prädikat.For performance reasons, instead of using the value() method in a predicate to compare with a relational value, use exist() with sql:column(). Dies wird im folgenden Beispiel D gezeigt.This is shown in example D that follows.

BeispieleExamples

A.A. Verwenden der value()-Methode mit einer Variablen vom Typ XMLUsing the value() method against an xml type variable

Im folgenden Beispiel ist eine XML-Instanz in einer Variablen des xml -Typs gespeichert.In the following example, an XML instance is stored in a variable of xml type. Mit der value() -Methode wird der Wert des ProductID -Attributs aus der XML-Instanz abgerufen.The value() method retrieves the ProductID attribute value from the XML. Dieser Wert wird dann einer int -Variablen zugewiesen.The value is then assigned to an int variable.

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  

Als Ergebnis wird Wert 1 zurückgegeben.Value 1 is returned as a result.

Obwohl es nur ein ProductID -Attribut in der XML-Instanz gibt, müssen Sie aufgrund der statischen Typisierungsregeln explizit angeben, dass der Pfadausdruck ein Singleton zurückgibt.Although there is only one ProductID attribute in the XML instance, the static typing rules require you to explicitly specify that the path expression returns a singleton. Deshalb wird zusätzlich [1] am Ende des Pfadausdrucks angegeben.Therefore, the additional [1] is specified at the end of the path expression. Weitere Informationen zur statischen Typisierung finden Sie unter XQuery and Static Typing.For more information about static typing, see XQuery and Static Typing.

B.B. Verwenden der value()-Methode zum Abrufen eines Werts aus einer Spalte vom Typ XMLUsing the value() method to retrieve a value from an xml type column

Die folgende Abfrage wird für eine Spalte vom Typ xml (CatalogDescription) in der AdventureWorks -Datenbank angegeben.The following query is specified against an xml type column (CatalogDescription) in the AdventureWorks database. Die Abfrage ruft die Werte des Attributs ProductModelID aus jeder in der Spalte gespeicherten XML-Instanz ab.The query retrieves ProductModelID attribute values from each XML instance stored in the column.

SELECT CatalogDescription.value('             
    declare namespace PD="https://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             

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:Note the following from the previous query:

  • Das namespace -Schlüsselwort wird verwendet, um ein Namespacepräfix zu definieren.The namespace keyword is used to define a namespace prefix.

  • Gemäß den Anforderungen der statischen Typisierung wird [1] am Ende des Pfadausdrucks in der value() -Methode hinzugefügt, um explizit anzugeben, dass der Pfadausdruck ein Singleton zurückgibt.Per static typing requirements, [1] is added at the end of the path expression in the value() method to explicitly indicate that the path expression returns a singleton.

Dies ist das Teilergebnis:This is the partial result:

-----------  
35           
34           
...  

C.C. Verwenden der value()- und der exist()-Methode zum Abrufen von Werten aus einer Spalte vom Typ XMLUsing the value() and exist() methods to retrieve values from an xml type column

Das folgende Beispiel veranschaulicht das Verwenden der beiden Methoden value() und exist() des xml -Datentyp sein.The following example shows using both the value() method and the exist() method of the xml data type. Die value() -Methode wird zum Abrufen von ProductModelID -Attributwerten aus der XML-Instanz verwendet.The value() method is used to retrieve ProductModelID attribute values from the XML. Mit der exist() -Methode in der WHERE -Klausel werden die Zeilen aus der Tabelle gefiltert.The exist() method in the WHERE clause is used to filter the rows from the table.

Mit der Abfrage werden Produktmodell-IDs aus XML-Instanzen mit Garantieinformationen (<Warranty>-Element) als eine der Funktionen abgerufen.The query retrieves product model IDs from XML instances that include warranty information (the <Warranty> element) as one of the features. Die Bedingung in der WHERE -Klausel verwendet die exist() -Methode, um nur solche Zeilen abzurufen, die diese Bedingung erfüllen.The condition in the WHERE clause uses the exist() method to retrieve only the rows satisfying this condition.

SELECT CatalogDescription.value('  
     declare namespace PD="https://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="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
  
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1  

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:Note the following from the previous query:

  • Die CatalogDescription -Spalte ist eine typisierte XML-Spalte.The CatalogDescription column is a typed XML column. Das bedeutet, dass ihr eine Schemaauflistung zugeordnet ist.This means that it has a schema collection associated with it. Im XQuery-Prolog wird die Namespacedeklaration für die Definition des Präfix verwendet, das später im Abfragetext verwendet wird.In the XQuery Prolog, the namespace declaration is used to define the prefix that is used later in the query body.

  • Wenn die exist()-Methode 1 (TRUE) zurückgibt, bedeutet dies, dass die XML-Instanz das untergeordnete <Warranty>-Element als eine der Funktionen enthält.If the exist() method returns a 1 (True), it indicates that the XML instance includes the <Warranty> child element as one of the features.

  • Die value() -Methode in der SELECT -Klausel ruft dann die ProductModelID -Attributwerte als ganze Zahlen ab.The value() method in the SELECT clause then retrieves the ProductModelID attribute values as integers.

Dies ist das Teilergebnis:This is the partial result:

Result       
-----------  
19           
23           
...  

D.D. Verwenden der exist()-Methode anstelle der value()-MethodeUsing the exist() method instead of the value() method

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.For performance reasons, instead of using the value() method in a predicate to compare with a relational value, use exist() with sql:column(). Beispiel:For example:

CREATE TABLE T (c1 int, c2 varchar(10), c3 xml)  
GO  
  
SELECT c1, c2, c3   
FROM T  
WHERE c3.value( '/root[1]/@a', 'integer') = c1  
GO  

Dies kann in der folgenden Weise geschrieben werden:This can be written in the following way:

SELECT c1, c2, c3   
FROM T  
WHERE c3.exist( '/root[@a=sql:column("c1")]') = 1  
GO  

Weitere InformationenSee Also

Hinzufügen von Namespaces zu Abfragen mit WITH XMLNAMESPACES Add Namespaces to Queries with WITH XMLNAMESPACES
Vergleichen von typisiertem XML mit nicht typisiertem XML Compare Typed XML to Untyped XML
Erstellen von Instanzen der XML-Daten Create Instances of XML Data
XML-Datentypmethoden xml Data Type Methods
XML DML (Data Modification Language)XML Data Modification Language (XML DML)