Użyj XQuery ogólne sprawy
W tym temacie przedstawiono ogólne przykładach XQuery.
Przykłady
A.Kwerenda wykazu opisy można znaleźć produkty i wagi
Następująca kwerenda zwraca iloczyn identyfikatory modelu oraz, jeśli takie istnieją, z opis katalogu produktów.Kwerendy konstrukcji XML, który ma następującą postać:
<Product ProductModelID="…">
<Weight>…</Weight>
</Product>
To jest kwerenda:
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
Pierwszy przycisk jest przyciskiem domyślnym.
The namespace keyword in the XQuery prolog defines a namespace prefix that is used in the query body.
Treść kwerendy konstruuje wymagane XML.
W klauzula WHERE EXIST() metoda jest używana do wyszukiwania tylko wiersze zawierające opisy katalog produktów.Oznacza to, XML, który zawiera <ProductDescription> element.
To jest 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"/>
Następująca kwerenda pobiera te same informacje, ale tylko dla tych modeli produktu opis katalogu zawiera wagę, <Weight> element w specyfikacji, <Specifications> element. W tym przykładzie użyto WITH XMLNAMESPACES zadeklarować prefiks pd i jego wiązania obszaru nazw.W ten sposób wiązanie nie opisano w obu Query() Metoda iEXIST() metody.
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 poprzedniej kwerendy EXIST() Metoda XML typ danych w klauzula WHERE sprawdza, czy jest elementem <Weight> <Specifications> elementu.
B.Znaleźć nazwy modelu produktu dla modeli produktów, których opis wykazu dołączyć obrazy z przodu kąt i mały rozmiar
Opis wykazu produktów XML zawiera obrazy produktu <Picture> element. Każdy obraz ma kilka właściwości.Obejmują one kąt obraz <Angle> element i rozmiar, <Size> element.
Dla modeli produktów, których opis wykazu dołączyć obrazy z przodu kąt i mały rozmiar kwerendy konstrukcji XML, który ma następującą postać:
< 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'
Pierwszy przycisk jest przyciskiem domyślnym.
W klauzula WHERE EXIST() metoda jest używana w celu pobrania tylko tych wierszy, które zawierają opisy katalog produktów z elementem <Picture> .
Użyto klauzula WHERE Value() metoda dwa razy na porównywaniu wartości o <Size> <Angle> elementów.
Jest to wynik częściowy:
<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.Tworzenie modelu pary nazw i funkcji, płaska lista produktu z każdej pary w nawiasach <Funkcje> element
W opisie wykazu modelu produktu kod XML zawiera kilka funkcji produktu.Funkcje te są zawarte w <Features> element. W kwerendzie użyto Budowa XML (XQuery) do konstruowania wymagane XML.Wyrażenie w nawiasy klamrowe zastępuje wynik.
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
Pierwszy przycisk jest przyciskiem domyślnym.
$ 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 elementu, węzły tekst, instrukcje przetwarzania i komentarze.
Dwa do pętli generowanie kartezjański, z którego zwracana jest nazwa produktu i poszczególnych funkcji.
The ProductName is an atrybut.Konstrukcji XML w tej kwerendzie zwraca ją do elementu.
Jest to wynik częściowy:
<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.Z opisem wykazu modelu produktu, produkt listy modelu identyfikator nazwę, model, a funkcje zgrupowane wewnątrz <Produkt> element
Korzystając z informacji przechowywanych w katalogu opis modelu produktu, poniższa kwerenda wyświetla nazwę modelu produktu, identyfikator modelu i funkcje zgrupowane wewnątrz <Produkt> element.
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
Jest to wynik częściowy:
<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.Pobrać opisy funkcji modelu produktu
Poniższa kwerenda tworzy XML, który zawiera <Product> element, który ma ProducModelID, ProductModelName atrybuty i pierwszym funkcji dwóch produktów.W szczególności pierwszego funkcje dwóch produktów są pierwsze elementów podrzędność dwóch <Features> element. W przypadku większej liczby 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
Pierwszy przycisk jest przyciskiem domyślnym.
- FOR...Struktura RETURN pętli pobiera pierwszy funkcji dwóch produktów.The position() funkcja is used to find the position of the elements in the sequence.
F.Znaleźć nazwy elementu z opis katalogu produktów, których nazwa kończy się frazą "dodatków"
Następująca kwerenda przeszukuje opisy wykazu i zwraca wszystkie elementy w <ProductDescription>element, którego nazwa kończy się na "dodatków".
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
Jest to wynik częściowy:
ProductModelID Result
-----------------------------------------
19 <Root>
<p1:Specifications xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
...
</p1:Specifications>
</Root>
G.Znaleźć opisy podsumowania, zawierające wyraz "Aerodynamic"
Następująca kwerenda pobiera modeli produktów, których opisy katalogu zawiera wyraz "Aerodynamic" 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
Należy zauważyć, że określa kwerendy WYBIERAJĄCEJ Query() and Value() metodXML typ danych.Dlatego zamiast powtarzanej deklaracja obszarów nazw dwa razy w dwóch prologs kwerendy różnica, prefiks pd jest używana w kwerendzie i jest zdefiniowany tylko raz przy użyciu XMLNAMESPACES WITH.
Pierwszy przycisk jest przyciskiem domyślnym.
Klauzula WHERE jest używana w celu pobrania tylko tych wierszy, opis katalogu zawiera wyraz "Aerodynamic" w <Summary> element.
The contains() funkcja is used to see if the word is included in the text.
The value() metoda of the xml data type compares the value returned by contains() to 1.
To jest 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.Znajdź modele produktów, których opis wykazu nie należy dołączać obrazy modelu produktu
Następujące kwerendy pobiera ProductModelIDs dla produktu modele opisów którego katalog nie zawierają <Picture> element.
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
Pierwszy przycisk jest przyciskiem domyślnym.
Jeśli EXIST() metoda w klauzula WHERE zwraca wartość false (0), zwracana jest identyfikator modelu produktu.W przeciwnym razie go nie jest zwracane.
Ponieważ zawiera opisy produktów <Picture> element, zestaw wyników jest pusty w w tym przypadek.
See Also