Funktionen, die sich auf QNames beziehen – expanded-QName
Gilt für:SQL Server
Gibt einen Wert des xs:QName-Typs mit dem im $paramURI angegebenen Namespace-URI und dem im $paramLocal angegebenen lokalen Namen zurück. Wenn $paramURI die leere Zeichenfolge oder die leere Sequenz ist, stellt sie keinen Namespace dar.
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.
Bemerkungen
Für die Funktion expanded-QName() gilt Folgendes:
Wenn der angegebene $paramLocal Wert nicht in der richtigen lexikalischen Form für den xs:NCName-Typ vorliegt, wird die leere Sequenz zurückgegeben und stellt einen dynamischen Fehler dar.
Die Konvertierung vom xs:QName-Typ in einen anderen Typ wird in SQL Server nicht unterstützt. Aus diesem Fall kann die funktion expanded-QName() nicht in der 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 vonexpanded-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. Vergleicht beispielsweise
/root[1]/e[1] eq expanded-QName("http://nsURI" "myNS")
den Wert des Elements mit dem QName,><e
der von der funktion expanded-QName() zurückgegeben wird.
Beispiele
Dieses Thema enthält XQuery-Beispiele für XML-Instanzen, die in verschiedenen Xml-Typspalten in der AdventureWorks2022
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. Das Beispiel führt die folgenden Aktionen aus:
Erstellen einer XML-Schemaauflistung, die ein Element vom Typ QName definiert.
Erstellt mithilfe der XML-Schemaauflistung eine Tabelle mit einer Xml-Typspalte .
Speichern einer XML-Instanz in der Tabelle.
Verwendet die modify()-Methode des xml-Datentyps, um den Wert des QName-Typelements im instance zu ändern. Die funktion expanded-QName() wird verwendet, um den neuen QName-Typwert zu generieren.
-- 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="https://myURI">
<ElemQN>ns:someName</ElemQN>
</Root>')
go
-- Verify the insertion
SELECT * from T
go
-- Result
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">
<ElemQN>ns:someName</ElemQN>
</Root>
In der folgenden Abfrage wird der <ElemQN
> Elementwert durch die modify() -Methode des xml-Datentyps und den Ersetzungswert von XML DML ersetzt, wie gezeigt.
-- the value.
UPDATE T
SET XmlCol.modify('
declare default element namespace "QNameXSD";
replace value of /Root[1]/ElemQN
with expanded-QName("https://myURI", "myLocalName") ')
go
-- Verify the result
SELECT * from T
go
Dies ist das Ergebnis. Beachten Sie, dass das Element <ElemQN
> vom Typ QName jetzt über einen neuen Wert verfügt:
<Root xmlns="QNameXSD" xmlns:ns="urn">
<ElemQN xmlns:p1="https://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 funktion expanded-QName kann nicht in der 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="https://someURI">a:b</root>')
go
-- Verify
SELECT *
FROM T
Der folgende Versuch fügt ein weiteres <root
> Element hinzu, schlägt jedoch fehl, da die funktion expanded-QName() 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
Eine Lösung hierfür besteht darin, zuerst eine instance mit einem Wert für das <root
> Element einzufügen und ihn dann zu ändern. In diesem Beispiel wird ein Null-Anfangswert 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="https://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 mit dem QName-Typwert übereinstimmen, der von der funktion expanded-QName() zurückgegeben wird.
SELECT xmlCol.query('
for $i in /root
return
if ($i eq expanded-QName("http://ns","someLocalName") ) then
$i
else
()')
FROM T
Implementierungseinschränkungen
Es gibt eine Einschränkung: Die funktion expanded-QName() akzeptiert die leere Sequenz als zweites Argument und gibt leer zurück, anstatt einen Laufzeitfehler zu auslösen, wenn das zweite Argument falsch ist.