Moduler och prologer – XQuery Prolog
gäller för:SQL Server
En XQuery-fråga består av en prolog och en brödtext. XQuery-prologen är en serie deklarationer och definitioner som tillsammans skapar den miljö som krävs för frågebearbetning. I SQL Server kan XQuery-prologen innehålla namnområdesdeklarationer. XQuery-brödtexten består av en sekvens med uttryck som anger det avsedda frågeresultatet.
Till exempel anges följande XQuery mot kolumnen Instruktioner i XML- typ som lagrar tillverkningsinstruktioner som XML. Frågan hämtar tillverkningsinstruktionerna för arbetscentrets plats 10
. Den query()
metoden för xml- datatyp används för att ange XQuery.
SELECT Instructions.query('declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root/AWMI:Location[@LocationID=10]
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Observera följande från föregående fråga:
XQuery-prologen innehåller en AWMI-deklaration (namespace prefix),
(namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
.Nyckelordet
declare namespace
definierar ett namnområdesprefix som används senare i frågetexten./AWMI:root/AWMI:Location[@LocationID="10"]
är frågetexten.
Namnområdesdeklarationer
En namnområdesdeklaration definierar ett prefix och associerar det med en namnområdes-URI, enligt följande fråga. I frågan är CatalogDescription
en xml- typkolumn.
När du anger XQuery mot den här kolumnen anger frågeprologen declare namespace
-deklarationen för att associera prefixet PD
, produktbeskrivning, med namnområdets URI. Det här prefixet används sedan i frågetexten i stället för namnområdets URI. Noderna i den resulterande XML-koden finns i namnområdet som är associerat med namnområdes-URI:n.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
where ProductModelID=19
För att förbättra frågeläsbarheten kan du deklarera namnområden med hjälp av MED XMLNAMESPACES i stället för att deklarera prefix och namnområdesbindning i frågeprologen med hjälp av declare namespace
.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
where ProductModelID=19
Mer information finns i Lägg till namnområden i frågor med XMLNAMESPACES.
Standarddeklaration för namnområde
I stället för att deklarera ett namnområdesprefix med hjälp av declare namespace
-deklarationen kan du använda declare default element namespace
-deklarationen för att binda ett standardnamnområde för elementnamn. I det här fallet anger du inget prefix.
I följande exempel anger sökvägsuttrycket i frågetexten inte något namnområdesprefix. Som standard tillhör alla elementnamn det standardnamnområde som anges i prologen.
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/ProductDescription/Summary
') as Result
FROM Production.ProductModel
WHERE ProductModelID=19
Du kan deklarera ett standardnamnområde med hjälp av WITH XMLNAMESPACES:
WITH XMLNAMESPACES (DEFAULT 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription')
SELECT CatalogDescription.query('
/ProductDescription/Summary
') as Result
FROM Production.ProductModel
WHERE ProductModelID=19