Dela via


Funktioner för dataåtkomst – data (XQuery)

gäller för:SQL Server

Returnerar det angivna värdet för varje objekt som anges av $arg.

Syntax

fn:data ($arg as item()*) as xdt:untypedAtomic*

Argument

$arg

Sekvens med objekt vars typerade värden returneras.

Anmärkningar

Följande överväganden gäller för inskrivna värden:

  • Det typerade värdet för ett atomiskt värde är det atomiska värdet.

  • Det typerade värdet för en textnod är strängvärdet för textnoden.

  • Det angivna värdet för en kommentar är strängvärdet för kommentaren.

  • Det angivna värdet för en bearbetningsinstruktion är innehållet i bearbetningsinstruktionen, utan målnamnet för bearbetningsinstruktionen.

  • Det typerade värdet för en dokumentnod är dess strängvärde.

Följande överväganden gäller för attribut- och elementnoder:

  • Om en attributnod skrivs med en XML-schematyp är dess typerade värde det typerade värdet.

  • Om attributnoden är otypad är dess typerade värde lika med dess strängvärde som returneras som en instans av xdt:untypedAtomic.

  • Om elementnoden inte har skrivits är dess typerade värde lika med dess strängvärde som returneras som en instans av xdt:untypedAtomic.

Följande överväganden gäller för inskrivna elementnoder:

  • Om elementet har en enkel innehållstyp data() returnerar det typerade värdet för elementet.

  • Om noden är av komplex typ, inklusive xs:anyType, data() returneras ett statiskt fel.

Även om det ofta är valfritt att använda data() funktionen, vilket visas i följande exempel, ökar det läsbarheten data() att ange funktionen explicit. Mer information finns i XQuery Basics.

Du kan inte ange data() för konstruerad XML, som du ser i följande exempel:

DECLARE @x AS XML;

SET @x = '';

SELECT @x.query('data(<SomeNode>value</SomeNode>)');

Exempel

Den här artikeln innehåller XQuery-exempel mot XML-instanser som lagras i olika xml-typkolumner i AdventureWorks-databasen .

A. Använd funktionen data() XQuery för att extrahera skrivet värde för en nod

Följande fråga illustrerar hur data() funktionen används för att hämta värden för ett attribut, ett element och en textnod:

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1, 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query(N'
 for $pd in //p1:ProductDescription
 return
    <Root
      ProductID = "{ data( ($pd//@ProductModelID)[1] ) }"
      Feature =   "{ data( ($pd/p1:Features/wm:Warranty/wm:Description)[1] ) }" >
    </Root>
 ') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 19;

Här är resultatet:

<Root ProductID="19" Feature="parts and labor"/>

Som nämnts data() är funktionen valfri när du skapar attribut. Om du inte anger funktionen antas den data() implicit. Följande fråga ger samma resultat som föregående fråga:

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1, 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
      for $pd in //p1:ProductDescription
         return
          <Root
                ProductID = "{ ($pd/@ProductModelID)[1] }"
                Feature =   "{ ($pd/p1:Features/wm:Warranty/wm:Description)[1] }" >
           </Root>
 ') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 19;

I följande exempel visas instanser där data() funktionen krävs.

I följande fråga $pd/p1:Specifications/Material returnerar elementet <Material> . data($pd/p1:Specifications/ Material) Returnerar också teckendata som skrivits som xdt:untypedAtomic, eftersom <Material> de är otypade. När indata är otypade skrivs resultatet av data() som xdt:untypedAtomic.

SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
      for $pd in //p1:ProductDescription
         return
          <Root>
             { $pd/p1:Specifications/Material }
             { data($pd/p1:Specifications/Material) }
           </Root>
 ') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 19;

Här är resultatet:

<Root>
  <Material>Aluminum Alloy</Material>Aluminum Alloy
</Root>

I följande fråga data($pd/p1:Features/wm:Warranty) returnerar ett statiskt fel, eftersom <Warranty> är ett komplext typelement.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1, 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
 <Root>
   {     /p1:ProductDescription/p1:Features/wm:Warranty }
   { data(/p1:ProductDescription/p1:Features/wm:Warranty) }
 </Root>
 ') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 23;