Freigeben über


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 QName.

Beispiele

Dieses Thema stellt XQuery-Beispiele für XML-Instanzen bereit, die in verschiedenen Spalten vom xml-Datentyp in der AdventureWorks2012 -Datenbank gespeichert sind.

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> unter Verwendung der modify()-Methode vom Typ XML und des Ersatzwerts von XML DML ersetzt, wie unten zu sehen ist.

-- 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 <ElemQN>-Element vom Typ QName jetzt über einen neuen Wert verfügt:

<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.Umgehend mit den Einschränkungen bei Verwendung der erweiterten 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

Im folgenden Versuch wird ein weiteres <root>-Element hinzugefügt. Dadurch wird jedoch ein Fehler erzeugt, da die erweiterte QName()-Funktion in der XML-Konstruktion nicht unterstützt wird.

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

Dies kann vermieden werden, indem zunächst eine Instanz mit einem Wert für das <root>-Element eingefügt und anschließend bearbeitet wird. In diesem Beispiel wird zunächst ein Nullwert verwendet, wenn das <root>-Element eingefügt wird. Die XML-Schemaauflistung in diesem Beispiel lässt einen Nullwert 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 in der folgenden Abfrage gezeigt: Die Abfrage gibt nur die <root>-Elemente zurück, deren Werte dem Wert vom Typ QName entsprechen, die von der expanded-QName()-Funktion zurückgegeben werden.

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.

Siehe auch

Konzepte

Funktionen, die sich auf QNames beziehen (XQuery)