expanded-QName (XQuery)

Devuelve un valor del tipo xs:QName con el URI de espacio de nombres especificado en $paramURI y el nombre local especificado en $paramLocal. Si $paramURI es una cadena o secuencia vacía, no representa ningún espacio de nombres.

Sintaxis

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

Argumentos

  • $paramURI
    Es el URI del espacio de nombres de QName.
  • $paramLocal
    Es la parte local del nombre de QName.

Notas

La información siguiente se aplica a la función expanded-QName():

  • Si el valor $paramLocal especificado no tiene la forma léxica correcta para el tipo xs:NCName, se devolverá la secuencia vacía y representará un error dinámico.
  • SQL Server 2005 no admite la conversión del tipo xs:QName a ningún otro tipo. Como consecuencia, no se puede utilizar la función expanded-QName() en la construcción de XML. Por ejemplo, cuando se construye un nodo, como <e> expanded-QName(…) </e>, el valor no puede tener un tipo. Esto requeriría la conversión del valor de tipo xs:QName devuelto por expanded-QName() en xdt:untypedAtomic. Sin embargo, esta opción no se admite. Más adelante en este tema se ofrece un ejemplo.
  • Es posible modificar o comparar los valores de tipo QName existentes. Por ejemplo, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") compara el valor del elemento <e> con el QName devuelto por la función expanded-QName().

Ejemplos

En este tema se proporcionan ejemplos de XQuery con instancias XML almacenadas en varios tipos de columnas xml de la base de datos de AdventureWorks. Para obtener información general de cada una de estas columnas, vea Representación de tipo de datos xml en la base de datos AdventureWorks.

A. Reemplazar un valor de nodo del tipo QName

En este ejemplo se ilustra cómo se puede modificar el valor de un nodo de elemento del tipo QName. En el ejemplo se realizan las operaciones siguientes:

  • Se crea una colección de esquemas XML que define un elemento del tipo QName.
  • Se crea una tabla con una columna de tipo xml mediante la colección de esquemas XML.
  • Se guarda una instancia XML en la tabla.
  • Se utiliza el método modify() del tipo de datos xml para modificar el valor del elemento del tipo QName en la instancia. La función expanded-QName() se utiliza para generar el nuevo valor del 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> 

En la consulta siguiente, se reemplaza el valor del elemento <ElemQN> con el método modify() del tipo de datos xml y la instrucción XML DML replace value of.

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

Éste es el resultado. Tenga en cuenta que ahora el elemento <ElemQN> del tipo QName tiene un nuevo valor:

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

Las instrucciones siguientes eliminan los objetos utilizados en el ejemplo.

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

B. Superar las limitaciones cuando se utiliza la función expanded-QName()

En SQL Server 2005 no se puede utilizar la función expanded-QName en la construcción de XML. En el siguiente ejemplo se ilustra este caso y la solución correspondiente:

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

El intento siguiente agrega otro elemento <root> pero se produce un error, puesto que no se admite la función expanded-QName() en la construcción de XML.

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

Una solución consiste en insertar primero una instancia con un valor para el elemento <root> y, a continuación, modificarlo. En este ejemplo, se utiliza un valor inicial nil cuando se inserta el elemento <root>. La colección de esquemas XML de este ejemplo permite un valor nil para el 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>

Se puede comparar el valor QName, tal y como se muestra en la consulta siguiente. La consulta sólo devolverá los elementos <root> cuyos valores coincidan con el valor del tipo QName devuelto por la función expanded-QName().

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

Limitaciones de la implementación

Existe una limitación: la función expanded-QName() acepta la secuencia vacía como segundo argumento y se devolverá vacía en lugar de provocar un error de tiempo de ejecución cuando el segundo argumento sea incorrecto.

Vea también

Conceptos

Funciones relacionadas con QNames (XQuery)

Ayuda e información

Obtener ayuda sobre SQL Server 2005