Udostępnij przez


Value() metoda (typ danych XML)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Wykonuje XQuery na XML i zwraca wartość typu SQL. Ta metoda zwraca wartość skalarną.

Zazwyczaj używa się tej metody do wyodrębnienia wartości z instancji XML przechowywanej w kolumnie, parametrze lub zmiennej typu xml . W ten sposób możesz określić SELECT zapytania łączące lub porównujące dane XML z danymi w kolumnach nie-XML.

Składnia

value ( XQuery , SQLType )

Arguments

XQuery

Wyrażenie XQuery , literal w formie ciągu tekstów, które pobiera dane wewnątrz instancji XML. XQuery musi zwracać co najwyżej jedną wartość. W przeciwnym razie zwracany jest błąd.

SQLType

Preferowany typ SQL, literal ciągu znaków, miał być zwracany. Typ zwrotu tej metody odpowiada parametrowi SQLType . SQLType może być typem danych SQL zdefiniowanym przez użytkownika.

Uwaga / Notatka

SQLType nie może być jednym z następujących typów danych: xml, obraz, tekst, ntext, sql_variant ani typem zdefiniowanym przez użytkownika w języku Common Language Runtime (CLR).

Metoda ta value() wykorzystuje operator Transact-SQL CONVERT w sposób domyślny. value() próbuje przekonwertować wynik wyrażenia XQuery, czyli serializowanej reprezentacji ciągu znaków, z XML Schema Definition (XSD) na odpowiadający mu typ SQL określony przez konwersję Transact-SQL. Więcej informacji o zasadach odlewania czcionki dla CONVERT, zobacz CAST i CONVERT.

Ze względów wydajnościowych możesz użyć exist() metody z zamiast sql:column()value() używać metody w predykacie, aby porównać z wartością relacyjną. Ten exist() przykład jest przedstawiony później w tym artykule.

Przykłady

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

A. Użyj metody value() przeciwko zmiennej typu XML

W poniższym przykładzie instancja XML jest przechowywana w zmiennej typu xml . Metoda value() pobiera wartość atrybutu ProductID z pliku XML. Wartość ta jest następnie przypisana zmiennej 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;

W wyniku zwraca się wartość .1

Chociaż w instancji XML jest tylko jeden ProductID atrybut, statyczne reguły typowania wymagają wyraźnego określenia, że wyrażenie ścieżki zwraca singleton. Dlatego do końca wyrażenia ścieżki dodaje się .[1] Więcej informacji o statycznym typowaniu można znaleźć w XQuery i statycznym typowaniu.

B. Użyj metody value() do pobrania wartości całkowitej z kolumny typu XML

Następujące zapytanie jest określone względem kolumny typu xml ()CatalogDescription w bazie AdventureWorks2025 danych. Zapytanie pobiera ProductModelID wartości atrybutów z każdej instancji XML zapisanej w kolumnie.

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;

Uwaga z poprzedniego zapytania:

  • Słowo namespace kluczowe służy do definiowania prefiksu przestrzeni nazw.

  • Zgodnie ze statycznymi wymaganiami typowania, jest dodawany na końcu wyrażenia ścieżki w metodzie[1], value() aby wyraźnie wskazać, że wyrażenie ścieżki zwraca pojedynczą liczbę.

Oto zestaw wyników.

35
34
28
25
23
19

C. Użyj metody value() do pobrania wartości ciągu z kolumny typu XML

Następujące zapytanie jest określone względem kolumny typu xml ()CatalogDescription w bazie AdventureWorks2025 danych. Zapytanie pobiera ProductModelName wartości atrybutów z każdej instancji XML zapisanej w kolumnie.

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;

Uwaga z poprzedniego zapytania:

  • Słowo namespace kluczowe służy do definiowania prefiksu przestrzeni nazw.

  • Zgodnie ze statycznymi wymaganiami typowania, jest dodawany na końcu wyrażenia ścieżki w metodzie[1], value() aby wyraźnie wskazać, że wyrażenie ścieżki zwraca pojedynczą liczbę.

Oto zestaw wyników.

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

D. Użyj metod value() i exist() do pobierania wartości z kolumny typu XML

Poniższy przykład pokazuje użycie zarówno metody, value() jak i metody exist() typu danych xml . Metoda ta value() służy do pobierania ProductModelID wartości atrybutów z XML. Metoda zawarta exist() w klauzuli WHERE służy do filtrowania wierszy z tabeli.

Zapytanie pobiera identyfikatory modeli produktu z instancji XML, które zawierają informacje o gwarancji (element) <Warranty> jako jedną z cech. Warunek w klauzuli WHERE wykorzystuje metodę exist() pobierania tylko wierszy spełniających ten warunek.

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;

Uwaga z poprzedniego zapytania:

  • Kolumna CatalogDescription to wpisana kolumna XML. Oznacza to, że posiada przypisaną kolekcję schematów. W Prologu Modules and Prologs - XQuery deklaracja przestrzeni nazw służy do definiowania prefiksu używanego później w ciele zapytania.

  • Jeśli exist() metoda zwraca 1 (true), oznacza to, że instancja XML zawiera element potomny <Warranty> jako jedną z cech.

  • Metoda value() w klauzuli SELECT pobiera wtedy ProductModelID wartości atrybutów jako liczby całkowite.

Oto częściowy wynik:

19
23
...

E. Użyj metody exist() zamiast metody value()

Ze względów wydajności, zamiast używać value() metody w predykacie do porównania z wartością relacyjną, używamy exist() z .sql:column() Przykład:

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

Ten kod można przepisać w następujący sposób:

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