Share 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 seqüê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 seqüê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 AdventureWorks. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks.

A. Substituição de 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. Tratamento de 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 seqüê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