Share via


expanded-QName (XQuery)

Gibt einen Wert vom Typ xs:QName mit dem in $paramURI angegebenen Namespace-URI und dem in $paramLocal angegebenen lokalen Namen zurück. Wenn $paramURI eine leere Zeichenfolge oder eine leere Sequenz ist, wird kein Namespace angegeben.

Syntax

fn:expanded-QName($paramURI as xs:string?, $paramLocal as xs:string?) as xs:QName?

Argumente

  • $paramURI
    Der Namespace-URI (Universal Resource Identifier) für QName.

  • $paramLocal
    Der lokale Teil des Namens von QName.

Hinweise

Für die expanded-QName()-Funktion gilt Folgendes:

  • Wenn der für $paramLocal angegebene Wert nicht der für den Typ xs:NCName lexikalisch richtigen Form entspricht, wird eine leere Sequenz als dynamischer Fehler zurückgegeben.

  • Das Konvertieren des Typs xs:QName in andere Typen wird in SQL Server nicht unterstützt. Daher kann die expanded-QName()-Funktion nicht für die XML-Konstruktion verwendet werden. Wenn Sie beispielsweise einen Knoten wie <e> expanded-QName(…) </e> konstruieren, darf der Wert nicht typisiert sein. Um dies zu erreichen, müssten Sie den von expanded-QName() zurückgegebenen Wert vom Typ xs:QName in xdt:untypedAtomic konvertieren. Dies wird jedoch nicht unterstützt. Eine Lösungsmöglichkeit wird nachfolgend in diesem Thema bereitgestellt.

  • Sie können vorhandene Werte vom Typ QName ändern oder vergleichen. Beispielsweise vergleicht /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") den Wert des Elements <e> mit dem von der expanded-QName()-Funktion zurückgegebenen Wert für QName.

Beispiele:

Diese Thema stellt XQuery-Beispiele für XML-Instanzen bereit, die in verschiedenen Spalten des xml-Typs in der AdventureWorks2008R2-Datenbank gespeichert sind. Einen Überblick über diese Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks2008R2-Datenbank.

A. Ersetzen eines Knotenwerts vom Typ QName

In diesem Beispiel wird veranschaulicht, wie Sie den Wert eines Elementknotens vom Typ QName ändern können. In diesem Beispiel werden folgende Vorgänge ausgeführt:

  • Erstellen einer XML-Schemaauflistung, die ein Element vom Typ QName definiert.

  • Erstellen einer Tabelle mit einer Spalte vom Typ xml mithilfe der XML-Schemaauflistung.

  • Speichern einer XML-Instanz in der Tabelle.

  • Verwenden der modify()-Methode vom Typ XML, um den Wert des Elements vom Typ QName in der Instanz zu ändern. Die expanded-QName()-Funktion wird zum Generieren des neuen Werts vom Typ QName verwendet.

-- If XML schema collection (if exists)
-- drop xml schema collection SC
-- go
-- Create XML schema collection
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="QNameXSD" 
      xmlns:xqo="QNameXSD" elementFormDefault="qualified">
      <element name="Root" type="xqo:rootType" />
      <complexType name="rootType">
            <sequence minOccurs="1" maxOccurs="1">
                        <element name="ElemQN" type="xs:QName" />
            </sequence>
      </complexType>
</schema>'
go
-- Create table.
CREATE TABLE T( XmlCol xml(SC) )
-- Insert sample XML instnace
INSERT INTO T VALUES ('
<Root xmlns="QNameXSD" xmlns:ns="http://myURI">
      <ElemQN>ns:someName</ElemQN>
</Root>')
go
-- Verify the insertion
SELECT * from T
go
-- Result
<Root xmlns="QNameXSD" xmlns:ns="http://myURI">
  <ElemQN>ns:someName</ElemQN>
</Root> 

In der folgenden Abfrage wird der Wert des Elements <ElemQN> mithilfe der modify()-Methode vom Datentyp XML durch den Ersatzwert von XML DML ersetzt, wie unten stehend gezeigt.

-- the value.
UPDATE T 
SET XmlCol.modify('
  declare default element namespace "QNameXSD"; 
  replace value of /Root[1]/ElemQN 
  with expanded-QName("http://myURI", "myLocalName") ')
go
-- Verify the result
SELECT * from T
go

Dies ist das Ergebnis. Beachten Sie, dass das Element <ElemQN> vom Typ QName jetzt einen neuen Wert besitzt:

<Root xmlns="QNameXSD" xmlns:ns="urn">
  <ElemQN xmlns:p1="http://myURI">p1:myLocalName</ElemQN>
</Root>

Die folgenden Anweisungen entfernen die in diesem Beispiel verwendeten Objekte.

-- Cleanup
DROP TABLE T
go
drop xml schema collection SC
go

B. Umgang der Einschränkungen beim Verwenden der expanded-QName()-Funktion

Die expanded-QName-Funktion nicht für die XML-Konstruktion verwendet werden. Dies wird anhand des folgenden Beispiels veranschaulicht. Im Beispiel wird zuerst ein Knoten eingefügt, um diese Einschränkung zu umgehen, und dann wird der Knoten geändert.

-- if exists drop the table T
--drop table T
-- go
-- Create XML schema collection
-- DROP XML SCHEMA COLLECTION SC
-- go
CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
      <element name="root" type="QName" nillable="true"/>
</schema>'
go
 -- Create table T with a typed xml column (using the XML schema collection)
CREATE TABLE T (xmlCol XML(SC))
go
-- Insert an XML instance.
insert into T values ('<root xmlns:a="http://someURI">a:b</root>')
 go
-- Verify
SELECT * 
FROM T

Der folgende Versuch soll ein weiteres <root>-Element hinzufügen, schlägt jedoch fehl, weil die XML-Konstruktion die expanded-QName()-Funktion nicht unterstützt.

update T SET xmlCol.modify('
insert <root>{expanded-QName("http://ns","someLocalName")}</root> as last into / ')
go

Eine Lösung besteht darin, zunächst eine Instanz mit einem Wert für das <root>-Element einzufügen und diesen anschließend zu ändern. In diesem Beispiel wird beim Einfügen des <root>-Elements ein Anfangswert von nil verwendet. Die in diesem Beispiel verwendete XML-Schemaauflistung lässt einen Wert von nil für das <root>-Element zu.

update T SET xmlCol.modify('
insert <root xsi:nil="true"/> as last into / ')
go
-- now replace the nil value with another QName.
update T SET xmlCol.modify('
replace value of /root[last()] with expanded-QName("http://ns","someLocalName") ')
go
 -- verify 
SELECT * FROM T
go
-- result
<root>b</root>

<root xmlns:a="http://someURI">a:b</root>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="http://ns">p1:someLocalName</root>

Sie können den Wert für QName vergleichen, wie im folgenden Beispiel gezeigt: Die Abfrage gibt nur die <root>-Elemente zurück, deren Werte mit dem von der expanded-QName()-Funktion zurückgegebenen Wert vom Typ QName übereinstimmen.

SELECT xmlCol.query('
    for $i in /root
    return
       if ($i eq expanded-QName("http://ns","someLocalName") ) then
          $i
       else
          ()')
FROM T

Implementierungseinschränkungen

Die folgende Einschränkung ist zu beachten: Die expanded-QName()-Funktion akzeptiert eine leere Sequenz als zweites Argument und gibt eine leere Sequenz zurück, statt einen Laufzeitfehler auszulösen, wenn das zweite Argument fehlerhaft ist.