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
Ten artykuł zawiera ogólne przykłady użycia zapytania XQuery.
Przykłady
A. Opisy wykazu zapytań w celu znalezienia produktów i wag
Poniższe zapytanie zwraca identyfikatory i wagi modelu produktu, jeśli istnieją, z opisu wykazu produktów. Zapytanie konstruuje kod XML, który ma następujący formularz:
<Product ProductModelID="...">
<Weight>...</Weight>
</Product>
Oto zapytanie:
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product ProductModelID="{ (/p1:ProductDescription/@ProductModelID)[1] }">
{
/p1:ProductDescription/p1:Specifications/Weight
}
</Product>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL;
Zwróć uwagę na następujące zagadnienia z poprzedniego zapytania:
Słowo
namespacekluczowe w prologu XQuery definiuje prefiks przestrzeni nazw używany w treści zapytania.Treść zapytania konstruuje wymagany kod XML.
W klauzuli
WHEREexist()metoda służy do znajdowania tylko wierszy zawierających opisy wykazu produktów. Oznacza to, że kod XML zawierający<ProductDescription>element .
Oto wynik:
<Product ProductModelID="19"/>
<Product ProductModelID="23"/>
<Product ProductModelID="25"/>
<Product ProductModelID="28"><Weight>Varies with size.</Weight></Product>
<Product ProductModelID="34"/>
<Product ProductModelID="35"/>
Poniższe zapytanie pobiera te same informacje, ale tylko dla tych modeli produktów, których opis katalogu zawiera wagę, element, <Weight> w specyfikacji, <Specifications> element. W tym przykładzie użyto WITH XMLNAMESPACES metody do zadeklarowania prefiksu pd i powiązania przestrzeni nazw. W ten sposób powiązanie nie jest opisane zarówno w metodzie query() , jak i w metodzie exist() .
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT CatalogDescription.query('
<Product ProductModelID="{ (/pd:ProductDescription/@ProductModelID)[1] }">
{
/pd:ProductDescription/pd:Specifications/Weight
}
</Product>
') AS x
FROM Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription/pd:Specifications//Weight ') = 1;
W poprzednim zapytaniu metoda typu danych XML w WHERE klauzuli sprawdza, exist() czy w elemecie <Specifications> znajduje <Weight> się element.
B. Znajdowanie identyfikatorów modeli produktów dla modeli produktów, których opisy katalogów obejmują zdjęcia kąta przedniego i małego rozmiaru
Opis katalogu produktów XML zawiera obrazy produktów, <Picture> element . Każdy obraz ma kilka właściwości, w tym kąt obrazu ( <Angle> element) i rozmiar ( <Size> element).
W przypadku modeli produktów, których opisy wykazu zawierają obrazy kąta przedniego i małego rozmiaru, zapytanie tworzy kod XML, który ma następujący formularz:
< Product ProductModelID="...">
<Picture>
<Angle>front</Angle>
<Size>small</Size>
</Picture>
</Product>
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT CatalogDescription.query('
<pd:Product ProductModelID="{ (/pd:ProductDescription/@ProductModelID)[1] }">
<Picture>
{ /pd:ProductDescription/pd:Picture/pd:Angle }
{ /pd:ProductDescription/pd:Picture/pd:Size }
</Picture>
</pd:Product>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription/pd:Picture') = 1
AND CatalogDescription.value('(/pd:ProductDescription/pd:Picture/pd:Angle)[1]', 'varchar(20)') = 'front'
AND CatalogDescription.value('(/pd:ProductDescription/pd:Picture/pd:Size)[1]', 'varchar(20)') = 'small'
Zwróć uwagę na następujące zagadnienia z poprzedniego zapytania:
W klauzuli
WHEREmetoda służy do pobieraniaexist()tylko wierszy, które mają opisy wykazu produktów z elementem<Picture>.Klauzula
WHEREvalue()używa metody dwa razy, aby porównać wartości<Size>elementów i<Angle>.
Oto częściowy wynik:
<p1:Product
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"
ProductModelID="19">
<Picture>
<p1:Angle>front</p1:Angle>
<p1:Size>small</p1:Size>
</Picture>
</p1:Product>
...
C. Utwórz płaską listę nazw i par funkcji modelu produktu z każdą parą ujętą w elemecie <Funkcje>
W opisie katalogu modeli produktów kod XML zawiera kilka funkcji produktu. Wszystkie te funkcje są uwzględnione w elemecie <Features> . Zapytanie używa konstrukcji XML (XQuery) do konstruowania wymaganego kodu XML. Wyrażenie w nawiasach klamrowych jest zastępowane wynikiem.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
for $pd in /p1:ProductDescription,
$f in $pd/p1:Features/*
return
<Feature>
<ProductModelName> { data($pd/@ProductModelName) } </ProductModelName>
{ $f }
</Feature>
') AS x
FROM Production.ProductModel
WHERE ProductModelID = 19;
Zwróć uwagę na następujące zagadnienia z poprzedniego zapytania:
$pd/p1:Features/*Zwraca tylko elementy podrzędne węzła<Features>, ale$pd/p1:Features/node()zwraca wszystkie węzły. Obejmuje to węzły elementów, węzły tekstowe, instrukcje przetwarzania i komentarze.FORDwie pętle generują produkt kartezjański, z którego zwracana jest nazwa produktu i pojedyncza funkcja.Jest
ProductNameto atrybut. Konstrukcja XML w tym zapytaniu zwraca ją jako element.
Oto częściowy wynik:
<Feature>
<ProductModelName>Mountain 100</ProductModelName>
<ProductModelID>19</ProductModelID>
<p1:Warranty
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>
<p1:Description>parts and labor</p1:Description>
</p1:Warranty>
</Feature>
<Feature>
<ProductModelName>Mountain 100</ProductModelName>
<ProductModelID>19</ProductModelID>
<p2:Maintenance xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p2:NoOfYears>10</p2:NoOfYears>
<p2:Description>maintenance contact available through your dealer
or any AdventureWorks retail store.</p2:Description>
</p2:Maintenance>
</Feature>
...
...
D. W opisie katalogu modelu produktu wyświetl listę nazwy modelu produktu, identyfikatora modelu i funkcji pogrupowanych wewnątrz <elementu Product>
Korzystając z informacji przechowywanych w opisie katalogu modelu produktu, poniższe zapytanie zawiera listę nazwy modelu produktu, identyfikatora modelu i funkcji pogrupowanych wewnątrz <Product> elementu.
SELECT ProductModelID,
CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product>
<ProductModelName>
{ data(/pd:ProductDescription/@ProductModelName) }
</ProductModelName>
<ProductModelID>
{ data(/pd:ProductDescription/@ProductModelID) }
</ProductModelID>
{ /pd:ProductDescription/pd:Features/* }
</Product>
') AS x
FROM Production.ProductModel
WHERE ProductModelID = 19;
Oto częściowy wynik:
<Product>
<ProductModelName>Mountain 100</ProductModelName>
<ProductModelID>19</ProductModelID>
<p1:Warranty>... </p1:Warranty>
<p2:Maintenance>... </p2:Maintenance>
<p3:wheel xmlns:p3="https://www.adventure-works.com/schemas/OtherFeatures">High performance wheels.</p3:wheel>
<p4:saddle xmlns:p4="https://www.adventure-works.com/schemas/OtherFeatures">
<p5:i xmlns:p5="http://www.w3.org/1999/xhtml">Anatomic design</p5:i> and made from durable leather for a full-day of riding in comfort.</p4:saddle>
<p6:pedal xmlns:p6="https://www.adventure-works.com/schemas/OtherFeatures">
<p7:b xmlns:p7="http://www.w3.org/1999/xhtml">Top-of-the-line</p7:b> clipless pedals with adjustable tension.</p6:pedal>
...
E. Pobieranie opisów funkcji modelu produktu
Poniższe zapytanie konstruuje kod XML zawierający element, który zawiera <Product>ProductModelIDatrybuty i ProductModelName dwie pierwsze funkcje produktu. W szczególności pierwsze dwie cechy produktu to dwa pierwsze elementy podrzędne <Features> elementu. Jeśli istnieje więcej funkcji, zwraca pusty <There-is-more/> element.
SELECT CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product>
{ /pd:ProductDescription/@ProductModelID }
{ /pd:ProductDescription/@ProductModelName }
{
for $f in /pd:ProductDescription/pd:Features/*[position()<=2]
return
$f
}
{
if (count(/pd:ProductDescription/pd:Features/*) > 2)
then <there-is-more/>
else ()
}
</Product>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL;
Zwróć uwagę na następujące zagadnienia z poprzedniego zapytania:
- Struktura
FORpętli ...RETURNpobiera dwie pierwsze funkcje produktu. Funkcjaposition()służy do znajdowania położenia elementów w sekwencji.
F. Znajdź nazwy elementów z opisu wykazu produktów, które kończą się na ons
Poniższe zapytanie wyszukuje opisy wykazu i zwraca wszystkie elementy w elemecie <ProductDescription> , którego nazwa kończy się na ons.
SELECT ProductModelID,
CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
for $pd in /p1:ProductDescription/*[substring(local-name(.),string-length(local-name(.))-2,3)="ons"]
return
<Root>
{ $pd }
</Root>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL;
Oto częściowy wynik:
ProductModelID Result
-----------------------------------------
19 <Root>
<p1:Specifications xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
...
</p1:Specifications>
</Root>
G. Znajdź opisy podsumowania zawierające słowo "Aerodynamika"
Następujące zapytanie pobiera modele produktów, których opisy katalogów zawierają wyraz "Aerodynamika" w opisie podsumowania:
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID,
CatalogDescription.query('
<Prod >
{ /pd:ProductDescription/@ProductModelID }
{ /pd:ProductDescription/pd:Summary }
</Prod>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.value('
contains( string( (/pd:ProductDescription/pd:Summary)[1] ),"Aerodynamic")', 'bit') = 1;
Zapytanie SELECT określa query() i value() metody typu danych XML . W związku z tym zamiast powtarzać deklarację przestrzeni nazw dwa razy w dwóch różnicowych prologach zapytań, prefiks pd jest używany w zapytaniu i jest definiowany tylko raz za pomocą polecenia WITH XMLNAMESPACES.
Zwróć uwagę na następujące zagadnienia z poprzedniego zapytania:
Klauzula
WHEREsłuży do pobierania tylko wierszy, w których opis katalogu zawiera słowo "Aerodynamika" w elemecie<Summary>.Funkcja
contains()służy do sprawdzenia, czy słowo jest zawarte w tekście.Metoda
value()typu danych XML porównuje wartość zwracaną przezcontains()1.
Oto wynik:
ProductModelID Result
-------------- ------------------------------------------
28 <Prod ProductModelID="28">
<pd:Summary xmlns:pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
A TRUE multi-sport bike that offers streamlined riding and a
revolutionary design. Aerodynamic design lets you ride with the
pros, and the gearing will conquer hilly roads.</p1:p>
</pd:Summary>
</Prod>
H. Znajdowanie modeli produktów, których opisy katalogów nie zawierają obrazów modelu produktu
Poniższe zapytanie pobiera identyfikatory ProductModelID dla modeli produktów, których opisy katalogów nie zawierają <Picture> elementu.
SELECT ProductModelID
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
AND CatalogDescription.exist('declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/p1:ProductDescription/p1:Picture
') = 0;
Zwróć uwagę na następujące zagadnienia z poprzedniego zapytania:
exist()Jeśli metoda w klauzuliWHEREzwraca wartość False (0), zwracany jest identyfikator modelu produktu. W przeciwnym razie nie jest zwracany.Ponieważ wszystkie opisy produktów zawierają
<Picture>element, zestaw wyników jest pusty w tym przypadku.
Treści powiązane
- XQueries z udziałem hierarchii
- XQueries z udziałem kolejności
- Obsługa danych relacyjnych w usłudze XQueries
- Wyszukiwanie ciągów w trybie XQuery
- Obsługa przestrzeni nazw w trybie XQuery
- Dodawanie przestrzeni nazw do zapytań przy użyciu funkcji WITH XMLNAMESPACES
- Dane XML (SQL Server)
- dokumentacja języka XQuery (SQL Server)