Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza 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
namespacekluczowe 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
namespacekluczowe 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
CatalogDescriptionto 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 zwraca1(true), oznacza to, że instancja XML zawiera element potomny<Warranty>jako jedną z cech.Metoda
value()w klauzuliSELECTpobiera wtedyProductModelIDwartoś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