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