Udostępnij za pośrednictwem


Value() metoda (typ danych xml)

Wykonuje XQuery przed XML i zwraca wartość typu programu SQL.Metoda zwraca wartość wartość skalarna.

Ta metoda zazwyczaj służy do wyodrębniania wartość XML wystąpienie przechowywane w xml Typ kolumna, parametr lub zmienna. W ten sposób można określić SELECT kwerendy, które łączą lub porównywania danych XML z danymi w kolumnach XML inny niż.

value (XQuery, SQLType)

Argumenty

  • XQuery
    Czy XQuery wyrażenie, literału ciąg, który pobiera dane wewnątrz kodu XML wystąpienie. XQuery musi zwracać co najwyżej jedną wartość.W przeciwnym razie zwracany jest błąd.

  • SQLType
    Jest to preferowany SQL typ, literału ciąg, powinny być zwrócone.The return type of this method matches the SQLType parameter.SQLType cannot be an xml data type, a common language runtime (CLR) user-defined type, image, text, ntext, or sql_variant data type.SQLType can be an SQL, user-defined data type.

The value() metoda uses the Transact-SQL CONVERT operator implicitly and tries to convert the result of the XQuery wyrażenie, the serialized ciąg representation, from XSD type to the corresponding SQL type specified by Transact-SQL conversion. Aby uzyskać więcej informacji na temat typu rzutowania reguł dla CONVERT zobacz CAST and CONVERT (Transact-SQL).

Uwaga

Ze względu na wydajność, zamiast Value() Metoda predykat do porównania z wartością relacyjnych, użyj EXIST() with SQL:kolumna().Jest ona wyświetlana w przykładzie poniżej D.

Przykłady

A.Za pomocą metoda value() przed zmienną typu danych xml

W poniższym przykładzie XML wystąpienie jest przechowywana w zmiennej xml Typ. The value() metoda retrieves the ProductID atrybut value from the XML. Wartość jest następnie przypisywany do int Zmienna.

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

Chociaż istnieje tylko jeden ProductID atrybut w pliku XML wystąpienie, wpisując statyczne zasady, należy jawnie określić, że wyrażenie ścieżka zwraca pojedyncza. Dlatego dodatkowe [1] podano na końcu wyrażenie ścieżka. Aby uzyskać więcej informacji na temat wpisywania statycznych zobacz XQuery i wpisywania statyczne.

B.Aby pobrać wartość z typem danych xml przy użyciu metoda value() kolumna

W następującej kwerendzie zostanie określona przed xml Wpisz (kolumnaCatalogDescription) w AdventureWorks Baza danych. Pobieranych przez kwerendę ProductModelID wartości atrybut z poszczególnych wystąpień XML przechowywane 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           

Pierwszy przycisk jest przyciskiem domyślnym.

  • The namespace keyword is used to define a namespace prefix.

  • Dla statycznego wymagania dotyczące pisania, [1] jest dodawany na końcu wyrażenia ścieżka w value() Metoda jawnie oznacza, że wyrażenie ścieżka zwraca pojedyncza.

Jest to wynik częściowy:

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

C.Za pomocą metody value() i exist() do pobrania wartości z kolumną typu danych xml

W poniższym przykładzie pokazano, przy użyciu obu value() Metoda oraz Metoda exist() of the xml Typ danych. The value() metoda is used to retrieve ProductModelID atrybut values from the XML. The exist() metoda in the WHERE klauzula is used to filter the rows from the tabela.

Model produktu identyfikatory z wystąpień XML, które zawierają informacje na temat gwarancji (pobieranych przez kwerendę <Warranty> element) jako jedną z funkcji. Warunek w WHERE użyto klauzula exist() Metoda w celu pobrania tylko wierszy spełniających ten 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

Pierwszy przycisk jest przyciskiem domyślnym.

  • The CatalogDescription kolumna is a typed XML kolumna. Oznacza to, że znajduje się kolekcja schematu skojarzony z nim.W Prolog XQuery, deklaracja obszaru nazw jest używany do definiowania prefiks, który będzie stosowany w dalszej części treści kwerendy.

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

  • The value() metoda in the SELECT klauzula then retrieves the ProductModelID atrybut values as integers.

Jest to wynik częściowy:

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

D.Za pomocą metoda exist() zamiast metoda value()

Ze względu na wydajność, zamiast value() Metoda w predykacie do porównania z wartością relacyjnej użycia 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

Mogą być zapisywane w następujący sposób:

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