Udostępnij za pośrednictwem


Value() metoda (xml typ danych)

Wykonuje XQuery przeciwko XML i zwraca wartość typu SQL .Ta metoda zwraca wartość wartość skalarna .

Zwykle używasz tej metoda wyodrębnić wartości z XML wystąpienie , przechowywane w xml typ kolumna, parametr lub zmiennej.W ten sposób można określić kwerend WYBIERAJĄCYCH, które łączą lub porównywania danych XML z danymi w kolumnach-XML.

Składnia

value (XQuery, SQLType)

Argumenty

  • XQuery
    Jest XQuery wyrażenie, ciąg literału, pobierający dane XML wystąpienie.XQuery musi zwracać co najwyżej jedną wartość.W przeciwnym razie zwracany jest błąd.

  • SQLType
    Jest to preferowany SQL typ, ciąg literału, powinny być zwrócone.Zwracany typ metoda odpowiada SQLType parametru.SQLTypenie może być xml , typ danych, wspólnego języka runtime (CLR) typ zdefiniowany przez użytkownika, image, text, ntext, lub sql_variant typu danych.SQLTypemoże być SQL, typ danych zdefiniowany przez użytkownika.

Value() korzysta zmetoda Transact-SQL niejawnie PRZEKONWERTOWAĆ operator i próbuje przekonwertować wynik XQuerywyrażenie, reprezentacja serializowane ciąg typu XSD na odpowiedni typ SQL określonej przez Transact-SQL konwersji. Aby uzyskać więcej informacji o regułach rzutowanie typu konwersji, zobacz CAST i CONVERT (Transact-SQL).

Ostrzeżenie

Ze względu na wydajność, zamiast value() metoda w predykacie do porównania z wartością relacyjnych, użyj exist() z sql: (kolumna).Pokazano na przykładzie d poniżej.

Przykłady

A.Za pomocą metoda value() wobec zmiennej typu xml

W poniższym przykładzie XML wystąpienie jest przechowywane w zmiennej xml typu.value()metoda pobiera ProductIDwartośćatrybut XML. Wartość przypisana do int zmienną.

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 rezultacie zwracana jest wartość 1.

Chociaż tylko jeden ProductID atrybut XML wystąpienie, statyczne reguł pisowni trzeba jawnie określić, że ścieżka wyrażenie zwraca pojedyncza.Dlatego dodatkowe [1] podano na końcu ścieżka wyrażenie.Aby uzyskać więcej informacji na temat wpisując statyczne zobacz XQuery i wpisując statyczne.

B.Pobierz wartość z typem kolumnaxml za pomocą value(), metoda

Następująca kwerenda jest określona przeciwko xml wpisz kolumna (CatalogDescription) w AdventureWorks2008R2 bazy danych.Kwerenda pobiera ProductModelIDwartościatrybut z każdego XML wystąpienie przechowywane w kolumna.

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           

Poniższe z poprzedniej kwerendy:

  • namespace Słowo kluczowe jest używany do definiowania prefiks obszaru nazw.

  • Na statyczne wpisując wymagań, [1] jest dodawany na końcu ścieżka wyrażenie w value() metoda wyraźnie wskazują, że ścieżka wyrażenie zwraca singleton.

Jest częściowo wynikiem:

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

C.Za pomocą metody value() i exist() do pobrania wartości z typem kolumnaxml

W poniższym przykładzie przedstawiono obie value() metoda i exist() metoda z xml typu danych.value()metoda jest używana do pobierania ProductModelIDwartościatrybut XML. exist()metoda w WHEREdo filtrowania wierszy z tabelajest używanaklauzula .

Kwerenda pobiera identyfikatory modeli produktu z wystąpień XML, które zawierają informacje o gwarancji ( <Warranty> element) jako jedną z funkcji.Warunek w WHEREkorzysta zklauzula exist()metoda pobierania tylko wiersze spełniające warunek.

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

Poniższe z poprzedniej kwerendy:

  • CatalogDescriptionkolumna jest wpisany XML kolumna. Oznacza to, że ma schematu kolekcja skojarzonych z nią.W XQuery prologu, deklaracja obszaru nazw jest używany do definiowania prefiks, który jest używany w dalszej części ciała kwerendy.

  • Jeśli exist()metoda zwraca 1 (True), wskazuje, że wystąpienie XML zawiera <Warranty>elementpodrzędność jako jedną z funkcji.

  • value()metoda w SELECTnastępnie pobieraklauzula ProductModelIDwartościatrybut jako liczby całkowite.

Jest częściowo wynikiem:

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

D.Przy użyciu metoda exist() zamiast value(), metoda

Ze względu na wydajność, zamiast value() metoda w predykacie do porównania z wartością relacyjnych, użyj exist() z sql:column().Na przykład:

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

Może to być zapisany w następujący sposób:

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