expanded-QName (XQuery)

Restituisce un valore di tipo xs:QName con l'URI dello spazio dei nomi specificato in $paramURI e il nome locale specificato in $paramLocal. Se $paramURI è la stringa vuota o la sequenza vuota, lo spazio dei nomi non viene utilizzato.

Sintassi

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

Argomenti

  • $paramURI
    URI dello spazio dei nomi dell'elemento QName.

  • $paramLocal
    Parte dell'elemento QName che rappresenta il nome locale.

Osservazioni

Quanto segue si applica alla funzione expanded-QName():

  • Se il valore $paramLocal specificato non è nella forma lessicale corretta per il tipo xs:NCName, viene restituita la sequenza vuota e viene generato un errore dinamico.

  • SQL Server non supporta la conversione dal tipo xs:QName a un tipo diverso. Per questo motivo non è possibile utilizzare la funzione expanded-QName() nella costruzione di strutture XML. Ad esempio, quando si costruisce un nodo come <e> expanded-QName(…) </e>, il valore deve essere non tipizzato. A questo scopo è necessario convertire il valore del tipo xs:QName restituito da expanded-QName() in xdt:untypedAtomic. La funzionalità non è tuttavia supportata. Una soluzione a questo problema è illustrata in un esempio di seguito in questo argomento.

  • È possibile modificare o confrontare i valori di tipo QName esistenti. Ad esempio, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") confronta il valore dell'elemento <e> con l'elemento QName restituito dalla funzione expanded-QName().

Esempi

In questo argomento vengono forniti esempi di utilizzo del linguaggio XQuery sulle istanze XML archiviate in diverse colonne di tipo xml nel database AdventureWorks2008R2. Per una panoramica su ognuna di queste colonne, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks2008R2.

A. Sostituzione di un valore di nodo di tipo QName

Nell'esempio seguente viene illustrata la procedura per modificare il valore di un nodo elemento di tipo QName. L'esempio esegue le operazioni seguenti:

  • Crea un insieme di schemi XML che definisce un elemento di tipo QName.

  • Crea una tabella con una colonna di tipo xml utilizzando l'insieme di schemi XML.

  • Salva un'istanza XML nella tabella.

  • Utilizza il metodo modify() del tipo di dati xml per modificare il valore dell'elemento di tipo QName nell'istanza. Per generare il nuovo valore del tipo QName viene utilizzata la funzione expanded-QName().

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

Nella query seguente il valore dell'elemento <ElemQN> viene sostituito utilizzando il metodo modify() del tipo di dati xml e l'istruzione XML DML "replace value", come illustrato di seguito.

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

Di seguito è riportato il risultato. Si noti che l'elemento <ElemQN> di tipo QName ha ora un nuovo valore:

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

Le istruzioni seguenti rimuovono gli oggetti utilizzati nell'esempio.

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

B. Gestione delle limitazioni di utilizzo della funzione expanded-QName()

Non è possibile utilizzare la funzione expanded-QName() nella costruzione di strutture XML. Questa condizione è illustrata nell'esempio seguente. Per ovviare a questa limitazione, nell'esempio viene inserito per prima cosa un nodo, che verrà poi modificato.

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

L'istruzione seguente tenta di aggiungere un nuovo elemento <root>, ma ha esito negativo perché la funzione expanded-QName() non è supportata nella costruzione di strutture XML.

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

Una soluzione consiste nell'inserire un'istanza con un valore per l'elemento <root> e quindi modificarla. In questo esempio quando viene inserito l'elemento <root> viene utilizzato un valore iniziale Null. L'insieme di schemi XML in questo esempio consente un valore Null per l'elemento <root>.

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>

È possibile confrontare il valore dell'elemento QName, come illustrato nella query seguente. La query restituisce solo l'elemento <root> i cui valori corrispondono al valore di tipo QName restituito dalla funzione expanded-QName().

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

Limitazioni di implementazione

Esiste un'unica limitazione: la funzione expanded-QName() accetta la sequenza vuota come secondo argomento e quando il secondo argomento è errato restituisce un valore vuoto invece di generare un errore di run-time.