Compartilhar via


expanded-QName (XQuery)

Retorna um valor do tipo xs:QName com o namespace URI especificado no $paramURI e o nome local especificado no $paramLocal. Se $paramURI for a cadeia de caracteres vazia ou a sequência vazia, ele não representará um namespace.

Sintaxe

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

Argumentos

  • $paramURI
    É o namespace URI para o QName.

  • $paramLocal
    É a parte do nome local do QName.

Comentários

O exposto a seguir se aplica à função expanded-QName():

  • Se o valor $paramLocal especificado não estiver na forma léxica correta do tipo xs:NCName, será retornada a sequência vazia e representará um erro dinâmico.

  • Não é oferecido suporte à conversão do tipo xs:QName em qualquer outro tipo no SQL Server. Devido a isso, a função expanded-QName() não pode ser usada na construção XML. Por exemplo, quando você estiver construindo um nó, como <e> expanded-QName(…) </e>, o valor precisa ser não digitado. Isso exigiria que você convertesse o valor de tipo xs:QName retornado por expanded-QName() para xdt:untypedAtomic. Porém, não é oferecido suporte para isso. Em um exemplo posterior neste tópico é oferecida uma solução.

  • Você pode modificar ou comparar os valores de tipo QName existentes. Por exemplo, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") compara o valor do elemento, <e>, com o QName retornado pela função expanded-QName().

Exemplos

Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados AdventureWorks2012 .

A.Substituindo um valor de nó do tipo QName

Este exemplo ilustra como você pode modificar o valor de um nó de elemento do tipo QName. O exemplo executa o seguinte:

  • Cria uma coleção de esquemas XML que define um elemento do tipo QName.

  • Cria uma tabela com uma coluna do tipo xml usando a coleção de esquemas XML.

  • Salva uma instância XML na tabela.

  • Usa o método modify() do tipo de dados xml para modificar o valor do elemento de tipo QName na instância. A função expanded-QName() é usada para gerar o valor do novo tipo 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> 

Na consulta a seguir, o valor do elemento <ElemQN> é substituído usando o método modify() do tipo de dados xml e do valor de substituição do XML DML, como mostrado.

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

Este é o resultado. Observe que o elemento <ElemQN> do tipo QName agora tem um novo valor:

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

As instruções a seguir removem os objetos usados no exemplo.

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

B.Tratando as limitações ao usar a função expanded-QName()

A função expanded-QName não pode ser usada na construção XML. O exemplo a seguir ilustra isto. Para solucionar essa limitação, o exemplo primeiro insere um nó e, em seguida, modifica o nó.

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

A tentativa a seguir adiciona outro elemento <root> mas falha, pois não há suporte para a função expanded-QName() na construção XML.

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

Uma solução para isso é primeiro inserir uma instância com um valor para o elemento <root> e, em seguida, modificá-lo. Neste exemplo, um valor inicial nulo é usado quando o elemento <root> é inserido. A coleção de esquemas XML neste exemplo permite um valor nulo para o 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>

Você pode comparar o valor QName, como mostrado na consulta a seguir. A consulta retorna somente os elementos <root> cujos valores correspondem ao valor do tipo QName retornado pela função expanded-QName().

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

Limitações de implementação

Há uma limitação: a função expanded-QName() aceita a sequência vazia como o segundo argumento e retorna vazia em vez de gerar um erro no tempo de execução quando o segundo argumento estiver incorreto.

Consulte também

Conceitos

Funções relacionadas a QNames (XQuery)