Udostępnij przez


Sequence and QNames (XQuery)

Dotyczy:programu SQL Server

W tym temacie opisano następujące podstawowe pojęcia dotyczące zapytania XQuery:

  • Kolejność

  • QNames i wstępnie zdefiniowane przestrzenie nazw

Kolejność

W środowisku XQuery wynikiem wyrażenia jest sekwencja, która składa się z listy węzłów XML i wystąpień typów niepodzielnych XSD. Pojedynczy wpis w sekwencji jest określany jako element. Element w sekwencji może być jednym z następujących elementów:

  • Węzeł, taki jak element, atrybut, tekst, instrukcja przetwarzania, komentarz lub dokument

  • Wartość niepodzielna, taka jak wystąpienie prostego typu XSD

Na przykład następujące zapytanie konstruuje sekwencję dwóch elementów węzła:

SELECT Instructions.query('  
     <step1> Step 1 description goes here</step1>,  
     <step2> Step 2 description goes here </step2>  
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  
  

Jest to wynik:

<step1> Step 1 description goes here </step1>  
<step2> Step 2 description goes here </step2>   

W poprzednim zapytaniu przecinek (,) na końcu konstrukcji <step1> jest konstruktorem sekwencji i jest wymagany. Białe spacje w wynikach są dodawane tylko do ilustracji i są uwzględniane we wszystkich przykładowych wynikach tej dokumentacji.

Poniżej znajdują się dodatkowe informacje, które należy wiedzieć o sekwencjach:

  • Jeśli zapytanie powoduje sekwencję zawierającą inną sekwencję, zawarta sekwencja zostanie spłaszczone do sekwencji kontenerów. Na przykład sekwencja (1,2, (3,4,5)),6) jest spłaszczona w modelu danych jako (1, 2, 3, 4, 5, 6).

    DECLARE @x xml;  
    SET @x = '';  
    SELECT @x.query('(1,2, (3,4,5)),6');  
    
  • Pusta sekwencja to sekwencja, która nie zawiera żadnego elementu. Jest reprezentowana jako "()".

  • Sekwencja z tylko jednym elementem może być traktowana jako wartość niepodzielna i odwrotnie. Oznacza to, (1) = 1.

W tej implementacji sekwencja musi być jednorodna. Oznacza to, że istnieje sekwencja wartości niepodzielnych lub sekwencja węzłów. Na przykład następujące są prawidłowe sekwencje:

DECLARE @x xml;  
SET @x = '';  
-- Expression returns a sequence of 1 text node (singleton).  
SELECT @x.query('1');  
-- Expression returns a sequence of 2 text nodes  
SELECT @x.query('"abc", "xyz"');  
-- Expression returns a sequence of one atomic value. data() returns  
-- typed value of the node.  
SELECT @x.query('data(1)');  
-- Expression returns a sequence of one element node.   
-- In the expression XML construction is used to construct an element.  
SELECT @x.query('<x> {1+2} </x>');  

Następujące zapytanie zwraca błąd, ponieważ sekwencje heterogeniczne nie są obsługiwane.

SELECT @x.query('<x>11</x>, 22');  

QName

Każdy identyfikator w trybie XQuery jest nazwą QName. Nazwa QName składa się z prefiksu przestrzeni nazw i nazwy lokalnej. W tej implementacji nazwy zmiennych w trybie XQuery są nazwami QName i nie mogą mieć prefiksów.

Rozważmy następujący przykład, w którym zapytanie jest określone względem nietypowej zmiennej xml:

DECLARE @x xml;  
SET @x = '<Root><a>111</a></Root>';  
SELECT @x.query('/Root/a');  

W wyrażeniu (/Root/a) Root i a są nazwami QName.

W poniższym przykładzie zapytanie jest określane względem typizowanej kolumny xml. Zapytanie iteruje wszystkie <kroku> elementów w pierwszej lokalizacji centrum pracy.

SELECT Instructions.query('  
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step  
      return  
           string($Step)   
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  

W wyrażeniu zapytania zwróć uwagę na następujące kwestie:

  • AWMI root, AWMI:Location, AWMI:stepi $Step są wszystkimi nazwami QName. AWMI jest prefiksem, a root, Locationi Step są nazwami lokalnymi.

  • Zmienna $step jest nazwą QName i nie ma prefiksu.

Następujące przestrzenie nazw są wstępnie zdefiniowane do użycia z obsługą XQuery w programie SQL Server.

Przedrostek URI
Xs http://www.w3.org/2001/XMLSchema
xsi http://www.w3.org/2001/XMLSchema-instance
xdt http://www.w3.org/2004/07/xpath-datatypes
Fn http://www.w3.org/2004/07/xpath-functions
(bez prefiksu) urn:schemas-microsoft-com:xml-sql
sqltypes https://schemas.microsoft.com/sqlserver/2004/sqltypes
XML http://www.w3.org/XML/1998/namespace
(bez prefiksu) https://schemas.microsoft.com/sqlserver/2004/SOAP

Każda tworzona baza danych ma kolekcję schematów sys XML. Rezerwuje te schematy, aby można było uzyskać do nich dostęp z dowolnej kolekcji schematów XML utworzonej przez użytkownika.

Nuta

Ta implementacja nie obsługuje prefiksu local zgodnie z opisem w specyfikacji XQuery w http://www.w3.org/2004/07/xquery-local-functions.

Zobacz też

XQuery Basics