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 2005 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 AdventureWorks-Datenbank gespeichert sind. Einen Überblick über diese Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks-Datenbank.

A. Ersetzen eines Knotenwertes 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 Wertes 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

In SQL Server 2005 kann die expanded-QName-Funktion nicht für die XML-Konstruktion verwendet werden. Das folgende Beispiel veranschaulicht dies und bietet eine Lösung:

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

Siehe auch

Konzepte

Funktionen, die sich auf QNames beziehen (XQuery)

Hilfe und Informationen

Informationsquellen für SQL Server 2005