Obsługa nazw w XQuery
W tym temacie przedstawiono przykłady obsługi nazw w kwerendach.
Przykłady
A.Deklarowanie 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 nazw zostanie użyte słowo kluczowe, aby zdefiniować nowy prefiks obszaru nazw "AWMI:".Tego prefiksu następnie musi być używany w kwerendzie dla wszystkich elementów, które wchodzą w zakres tego obszaru nazw.
B.Deklarowanie domyślny obszar nazw
W poprzedniej kwerendy został zdefiniowany nowy prefiks obszaru nazw.Następnie tego prefiksu było używane w kwerendzie, aby zaznaczyć zamierzone struktury XML.Alternatywnie można zadeklarować nazw jako domyślny obszar nazw, jak pokazano w następującej kwerendzie zmodyfikowane:
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 puste, obszar nazw.Z tego powodu nie ma prefiks obszaru nazw ścieżka wyrażenie używane do kwerendy.Jest również już prefiks obszaru nazw w nazwach elementów, które pojawiają się w wyniki.Ponadto domyślny obszar nazw jest stosowana do wszystkich elementów, ale nie do ich atrybutów.
C.Korzystanie z przestrzeni nazw XML budowy
Podczas definiowania nowego obszary nazw są one doprowadzone do zakres, nie tylko dla kwerendy, ale na budowę.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 elementów i atrybutów, które konstruowania pojawił się w kwerendzie wyniki.
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
Jest to wynikiem:
<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 również zdefiniować nazw wyraźnie w każdym punkcie, gdzie jest używany jako część konstrukcji XML, jak 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ślnego obszaru nazw.
Można także zdefiniować domyślny obszar nazw dla stosowania konstruowanej XML.Na przykład, poniższa kwerenda pokazuje, jak można określić domyślny obszar nazw, "uri:SomeNamespace" \, używany jako domyślny dla lokalnie nazwanych elementów, które są zbudowane, takich jak <Result> elementu.
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
Jest to wynikiem:
<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, lokalnie nazwanych elementów w konstruowanej XML później są powiązane z nadrzędnych domyślny obszar nazw.Dlatego Jeśli wymagasz elastyczność przy konstruowaniu XML, aby skorzystać z pustym obszarem nazw nie zastępuje domyślny obszar nazw elementu.
Zobacz także