Sdílet prostřednictvím


Funkce přistupování dat – data (XQuery)

platí pro:SQL Server

Vrátí zadanou hodnotu pro každou položku určenou $arg.

Syntax

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

Argumenty

$arg

Posloupnost položek, jejichž typové hodnoty jsou vráceny.

Poznámky

Následující aspekty platí pro typové hodnoty:

  • Zadaná hodnota atomické hodnoty je atomická hodnota.

  • Zadaná hodnota textového uzlu je řetězcová hodnota textového uzlu.

  • Zadaná hodnota komentáře je řetězcová hodnota komentáře.

  • Typová hodnota instrukce zpracování je obsah instrukce zpracování bez názvu cíle instrukce zpracování.

  • Zadaná hodnota uzlu dokumentu je její řetězcová hodnota.

Následující aspekty platí pro uzly atributů a prvků:

  • Pokud je uzel atributu zadán s typem schématu XML, jeho typová hodnota je zadaná hodnota odpovídajícím způsobem.

  • Pokud je uzel atributu nezatypovaný, jeho zadaná hodnota se rovná řetězcové hodnotě, která je vrácena jako instance xdt:untypedAtomic.

  • Pokud uzel elementu nebyl zadán, jeho zadaná hodnota je rovna řetězcové hodnotě, která je vrácena jako instance xdt:untypedAtomic.

Následující aspekty platí pro uzly typů elementů:

  • Pokud má element jednoduchý typ obsahu, data() vrátí zadaná hodnota prvku.

  • Pokud je uzel komplexního typu, včetně xs:anyType, data() vrátí statickou chybu.

I když je použití data() funkce často volitelné, jak je znázorněno v následujících příkladech, zadávání data() funkce explicitně zvyšuje čitelnost dotazů. Další informace naleznete v tématu XQuery Basics.

Nelze zadat data() pro vytvořený kód XML, jak je znázorněno v následujícím příkladu:

DECLARE @x AS XML;

SET @x = '';

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

Příklady

Tento článek obsahuje příklady XQuery pro instance XML uložené v různých sloupcích typu XML v databázi AdventureWorks.

A. Extrahování typové hodnoty uzlu pomocí funkce XQuery data()

Následující dotaz ukazuje, jak data() se funkce používá k načtení hodnot atributu, elementu a textového uzlu:

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;

Tady je výsledek:

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

Jak už bylo zmíněno, data() funkce je volitelná při vytváření atributů. Pokud funkci nezadáte data() , předpokládá se implicitně. Následující dotaz vytvoří stejné výsledky jako předchozí dotaz:

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;

Následující příklady ilustrují instance, ve kterých je funkce povinná data() .

V následujícím dotazu $pd/p1:Specifications/Material vrátí <Material> prvek. data($pd/p1:Specifications/ Material) Vrátí také datový typ znaku jako xdt:untypedAtomic, protože <Material> je nezatypovaný. Pokud je vstup nezatypovaný, výsledek data() je zadán jako 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;

Tady je výsledek:

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

V následujícím dotazu data($pd/p1:Features/wm:Warranty) vrátí statickou chybu, protože <Warranty> je komplexní prvek typu.

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;