Funktionen, die sich auf QNames beziehen – expanded-QName
Gilt für: SQL Server
Gibt einen Wert des Typs "xs:QName" mit dem namespace-URI zurück, der in der $paramURI und dem im $paramLocal angegebenen lokalen Namen angegeben ist. 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.
Hinweise
Folgendes gilt für die Funktion expanded-QName() :
Wenn sich der angegebene $paramLocal Wert nicht in der richtigen lexikalischen Form für xs:NCName-Typ befindet, wird die leere Sequenz zurückgegeben und stellt einen dynamischen Fehler dar.
Die Konvertierung von xs:QName-Typ in einen anderen Typ wird in SQL Server nicht unterstützt. Aus diesem Fall kann die Expanded-QName() -Funktion 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 z. B
/root[1]/e[1] eq expanded-QName("http://nsURI" "myNS")
. den Wert des Elements mit dem QName, <>e
der von der Expanded-QName()-Funktion 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 eine Tabelle mit einer XML-Typspalte mithilfe der XML-Schemaauflistung.
Speichern einer XML-Instanz in der Tabelle.
Verwendet die Modify()- Methode des XML-Datentyps, um den Wert des QName-Typelements in der Instanz zu ändern. Die Expanded-QName() -Funktion 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 instance
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 dargestellt.
-- 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
> des QName-Typs 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 Expanded-QName-Funktion 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 Instanz mit einem Wert für das <root
> Element einzufügen und dann zu ändern. In diesem Beispiel wird ein Null-Anfangswert verwendet, wenn das <root
> Element eingefügt wird. Die XML-Schemaauflistung in diesem Beispiel ermöglicht einen Nilwert für das <root
> Element.
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 dem QName-Typwert entsprechen, der von der Expanded-QName() -Funktion 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 Expanded-QName() -Funktion akzeptiert die leere Sequenz als zweites Argument und gibt leer zurück, anstatt einen Laufzeitfehler zu auslösen, wenn das zweite Argument falsch ist.