Value() metoda (XML datový typ)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Provede XQuery proti XML a vrátí hodnotu typu SQL. Tato metoda vrací skalární hodnotu.

Tuto metodu obvykle používáte k extrakci hodnoty z XML instance uložené ve sloupci, parametru nebo proměnné typu xml. Tímto způsobem můžete specifikovat SELECT dotazy, které kombinují nebo porovnávají XML data s daty v ne-XML sloupcích.

Syntaxe

value ( XQuery , SQLType )

Arguments

XQuery

Výraz XQuery , což je literál řetězce, který získává data uvnitř XML instance. XQuery musí vrátit maximálně jednu hodnotu. Jinak se vrátí chyba.

SQLType

Preferovaný SQL typ, stringový literál, měl být vrácen. Typ návratu této metody odpovídá parametru SQLType . SQLType může být uživatelsky definovaný typ SQL dat.

Poznámka:

SQLType nemůže být jedním z následujících datových typů: xml, image, text, ntext, sql_variant nebo uživatelsky definovaný běžný (CLR) v běžném jazyce.

Metoda value() implicitně používá Transact-SQL CONVERT operátor. value() snaží se převést výsledek výrazu XQuery, serializované reprezentace řetězců, z XML Schema Definition (XSD) typu na odpovídající SQL typ specifikovaný Transact-SQL konverzí. Pro více informací o pravidlech pro odlévání typů pro CONVERT, viz CAST a CONVERT.

Z důvodů výkonu můžete exist() použít metodu s pomocí místo sql:column() použití value() v predikátu pro srovnání s relační hodnotou. Tento exist() příklad je uveden později v tomto článku.

Examples

Ukázky kódu v tomto článku používají databázi , AdventureWorksDW2025, neboli AdventureWorksLT2025 ukázkovou databáziAdventureWorks2025, kterou si můžete stáhnout z Azure Data SQL Samples Repository GitHub repository.

A. Použijte metodu value() proti XML typové proměnné

V následujícím příkladu je instance XML uložena ve proměnné typu xml . Metoda value() získá ProductID hodnotu atributu z XML. Hodnota je pak přiřazena proměnné int .

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;

Výsledkem je vrácena hodnota .1

Ačkoliv je v XML instanci pouze jeden ProductID atribut, statická pravidla typování vyžadují, abyste explicitně uvedli, že výraz cesty vrací singleton. Proto se přidává na [1] konec výrazu cesty. Pro více informací o statickém typování viz XQuery a statické typování.

B. Použijte metodu value() k získání celočíselné hodnoty ze sloupce XML typu

Následující dotaz je zadán pro sloupec typu xml ()CatalogDescription v databázi AdventureWorks2025 . Dotaz získává ProductModelID hodnoty atributů z každé XML instance uložené ve sloupci.

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;

Poznámka z předchozího dotazu:

  • Klíčové namespace slovo se používá k definování prefixu jmenného prostoru.

  • Podle statických požadavků na typování je na konci výrazu cesty v metodě [1] přidán výrazvalue(), který explicitně označuje, že výraz cesty vrací singleton.

Tady je soubor výsledků.

35
34
28
25
23
19

C. Použijte metodu value() k získání hodnoty řetězce ze sloupce XML typu

Následující dotaz je zadán proti sloupci typu xml ()CatalogDescription v databázi AdventureWorks2025 . Dotaz získává ProductModelName hodnoty atributů z každé XML instance uložené ve sloupci.

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;

Poznámka z předchozího dotazu:

  • Klíčové namespace slovo se používá k definování prefixu jmenného prostoru.

  • Podle statických požadavků na typování je na konci výrazu cesty v metodě [1] přidán výrazvalue(), který explicitně označuje, že výraz cesty vrací singleton.

Tady je soubor výsledků.

Touring-2000
Touring-1000
Road-450
Road-150
Mountain-500
Mountain 100

D. Použijte metody value() a exist() k získání hodnot z XML sloupce typu

Následující příklad ukazuje použití jak metody, value() tak metody exist() pro xml datový typ. Tato value() metoda se používá k získání ProductModelID hodnot atributů z XML. Metoda exist() ve klauzuli WHERE slouží k filtrování řádků z tabulky.

Dotaz získává ID produktových modelů z XML instancí, které obsahují záruční informace (prvek <Warranty> ) jako jednu z funkcí. Podmínka ve klauzuli WHERE používá metodu exist() k získání pouze řádků splňujících tuto podmínku.

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;

Poznámka z předchozího dotazu:

  • Sloupec CatalogDescription je typovaný XML sloupec. To znamená, že má přiřazenou sbírku schémat. V Prologu Modules and Prologs - XQuery se deklarace jmenného prostoru používá k definování prefixu, který se později použije v těle dotazu.

  • Pokud exist() metoda vrátí 1 (true), znamená to, že XML instance obsahuje podprvek <Warranty> jako jednu z funkcí.

  • Metoda value() v klauzuli SELECT pak ProductModelID získá hodnoty atributů jako celá čísla.

Tady je částečný výsledek:

19
23
...

E. Použijte metodu exist() místo metody value()

Z důvodů výkonu místo použití value() metody v predikátu pro porovnání s relační hodnotou použijeme exist() s .sql:column() Například:

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

Tento kód lze přepsat následovně:

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