Obsługa obszarów nazw w XQuery
W tym temacie Przykłady obsługi obszarów nazw w kwerendach.
Przykłady
A.Zadeklarowanie obszaru nazw
Następująca kwerenda pobiera etapy wytwarzania określonego modelu produktu.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root/AWMI:Location[1]/AWMI:step
') as x
FROM Production.ProductModel
WHERE ProductModelID=7
Jest to wynik częściowy:
<AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. </AWMI:step>
…
Należy zauważyć, że obszar nazw słowo kluczowe jest używana do definiowania nowych prefiks obszaru nazw, „ AWMI: ".Ten prefiks następnie należy użyć kwerendy dla wszystkich elementów, które wchodzą w zakres tego obszaru nazw.
B.Zadeklarowanie domyślny obszar nazw
Nowy prefiks obszaru nazw został zdefiniowany w poprzedniej kwerendy.Tego prefiksu musiał następnie być używane w kwerendzie Wybierz zamierzonego struktury XML.Alternatywnie można zadeklarować obszar nazw jako domyślny obszar nazw, jak pokazano w następującej kwerendzie zmodyfikowanych:
SELECT Instructions.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/root/Location[1]/step
') as x
FROM Production.ProductModel
where ProductModelID=7
Wynik
<step xmlns="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <material>aluminum sheet MS-2341</material> into the <tool>T-85A framing tool</tool>. </step>
…
Uwaga w tym przykładzie zdefiniowanego obszaru nazw, "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions", do zastąpienia domyślnego, lub jest pusta, obszar nazw. Z tego powodu nie ma prefiksu obszaru nazw w wyrażeniu ścieżka, która jest używana do kwerendy.Nie masz również prefiks obszaru nazw w nazwach elementów, które pojawiają się w wyniki.Ponadto domyślny obszar nazw jest stosowane do wszystkich elementów, ale nie do ich atrybutów.
C.Za pomocą obszarów nazw w budowie XML
Podczas definiowania nowego obszary nazw są one wprowadzone do zakres, nie tylko dla tej kwerendy, ale do budowy.Na przykład przy konstruowaniu XML, można zdefiniować nowy obszar nazw przy użyciu "declare namespace ..."deklaracja, a następnie użyć tego obszaru nazw ze wszystkich elementów i atrybutów, które konstruowania się pojawiać w wynikach kwerendy.
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace myNS="uri:SomeNamespace";<myNS:Result>
{ /ProductDescription/Summary }
</myNS:Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
To jest wynik:
<myNS:Result xmlns:myNS="uri:SomeNamespace">
<Summary xmlns="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
Our top-of-the-line competition mountain bike. Performance-enhancing
options include the innovative HL Frame, super-smooth front
suspension, and traction for all terrain.</p1:p>
</Summary>
</myNS:Result>
Alternatywnie można także zdefiniować nazw jawnie w każdym punkcie, w którym jest używany jako część konstrukcji XML, jak to pokazano w następującej kwerendzie:
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<myNS:Result xmlns:myNS="uri:SomeNamespace">
{ /ProductDescription/Summary }
</myNS:Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
D.Budowa przy użyciu domyślnej przestrzeni nazw
Można także zdefiniować domyślny obszar nazw do użytku w zbudowane w formacie XML.Na przykład, poniższa kwerenda pokazuje, w jaki sposób można określić domyślny obszar nazw, „ uri:SomeNamespace „ \, aby użyć domyślnej dla lokalnie nazwanych elementów, które są konstruowane, takie jak <Result> element.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare default element namespace "uri:SomeNamespace";<Result>
{ /PD:ProductDescription/PD:Summary }
</Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
To jest wynik:
<Result xmlns="uri:SomeNamespace">
<PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
Our top-of-the-line competition mountain bike. Performance-
enhancing options include the innovative HL Frame, super-smooth
front suspension, and traction for all terrain.</p1:p>
</PD:Summary>
</Result>
Należy zauważyć, że przez zastąpienie domyślny obszar nazw elementu lub pusty obszar nazw, wszystkie elementy lokalnie nazwane w skonstruowany kod XML później są powiązane z nadrzędnych domyślny obszar nazw.Dlatego jeśli potrzebna jest elastyczność w tworzeniu XML, aby skorzystać z pustym obszarem nazw, nie zastępują domyślny obszar nazw elementu.