Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Detta ämne ger exempel för hantering av namnrymder i frågor.
Examples
A. Deklarering av ett namnrymd
Följande fråga hämtar tillverkningsstegen för en specifik produktmodell.
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
Detta är det partiella resultatet:
<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>
...
Observera att namnrymdsnyckelordet används för att definiera ett nytt namnrymdsprefix, "AWMI:". Detta prefix måste sedan användas i frågan för alla element som faller inom namnrymdens omfattning.
B. Deklarering av ett standardnamnrymd
I den föregående frågan definierades ett nytt namnrymdsprefix. Det prefixet måste sedan användas i frågan för att välja de avsedda XML-strukturerna. Alternativt kan du deklarera ett namnrymd som standardnamnrymd, som visas i följande modifierade fråga:
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
Det här är resultatet
<step xmlns="http://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>
...
Observera i detta exempel att det definierade namnrymden, "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions", görs för att åsidosätta standardnamnrymden eller tomma namnrymden. På grund av detta har du inte längre något namnrymdsprefix i sökvägsuttrycket som används för att fråga. Du har inte heller längre något namnrymdsprefix i elementnamnen som visas i resultaten. Dessutom tillämpas standardnamnrymden på alla element, men inte på deras attribut.
C. Användning av namnrymder i XML-konstruktion
När du definierar nya namnrymder tas de in i omfattning inte bara för frågan, utan även för konstruktionen. Till exempel, när du konstruerar XML kan du definiera ett nytt namnrymd genom att använda "declare namespace ...""-deklarationen och sedan använda det namnrymden med alla element och attribut du konstruerar för att visas i frågeresultaten.
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
Det här är resultatet:
<myNS:Result xmlns:myNS="uri:SomeNamespace">
<Summary xmlns="http://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>
Alternativt kan du också definiera namnrymden explicit vid varje punkt där den används som en del av XML-konstruktionen, som visas i följande fråga:
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. Konstruktion med standardnamnrymder
Du kan också definiera ett standardnamnrymd för användning i konstruerad XML. Till exempel visar följande fråga hur du kan specificera ett standardnamnrymd, "uri:SomeNamespace"\, som ska användas som standard för de lokalt namngivna elementen som konstrueras, såsom elementet <Result> .
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
Det här är resultatet:
<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>
Observera att genom att överskriva standardelementnamnrymden eller tomma namnrymden binds alla lokalt namngivna element i den konstruerade XML:n därefter till den överskrivande standardnamnrymden. Därför, om du behöver flexibilitet i att konstruera XML för att dra nytta av det tomma namnrymden, åsidosätt inte standardelementnamnrymden.