Exporter (0) Imprimer
Développer tout
Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
Traduction
Source

expanded-QName (XQuery)

Renvoie une valeur du type xs:QName avec l'URI d'espace de noms spécifié dans l'argument $paramURI et le nom local spécifié dans l'argument $paramLocal. Si l'argument $paramURI est la chaîne vide ou la séquence vide, il ne représente aucun espace de noms.

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

$paramURI

URI d'espace de noms du QName.

$paramLocal

Partie du nom local du QName.

Les conditions suivantes s'appliquent à la fonction expanded-QName() :

  • Si la valeur $paramLocal spécifiée n'est pas exprimée dans la forme lexicale correcte du type xs:NCName, la séquence vide est renvoyée et représente une erreur dynamique.

  • SQL Server ne prend en charge la conversion du type xs:QName vers aucun autre type. Par conséquent, la fonction expanded-QName() ne peut pas être utilisée dans une construction XML. Par exemple, lorsque vous construisez un nœud, tel que <e> expanded-QName(…) </e>, la valeur doit être non typée. Cela suppose que vous convertissiez la valeur de type xs:QName renvoyée par expanded-QName() en xdt:untypedAtomic. Toutefois, cette opération n'est pas prise en charge. Une solution est proposée dans un exemple, plus loin dans cette rubrique.

  • Vous pouvez modifier ou comparer les valeurs de type QName existantes. Par exemple, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") compare la valeur de l'élément <e> au QName renvoyé par la fonction expanded-QName().

Cette rubrique propose des exemples de XQuery relatifs à des instances XML stockées dans différentes colonnes de type xml tirées de la base de données AdventureWorks2012 .

A.Remplacement d'une valeur de nœud de type QName

Cet exemple montre comment vous pouvez modifier la valeur d'un nœud d'élément de type QName. L'exemple effectue les opérations suivantes :

  • Crée une collection de schémas XML qui définit un élément de type QName.

  • Crée une table dotée d'une colonne de type xml à l'aide de la collection de schémas XML.

  • Enregistre une instance XML dans la table.

  • Utilise la méthode modify() du type de données xml pour modifier la valeur de l'élément de type QName dans l'instance. La fonction expanded-QName() permet de générer la nouvelle valeur de type 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> 

Dans la requête suivante, la valeur de d'élément <ElemQN> est remplacée à l'aide de la méthode modify() du type de données xml et de la fonction DML XML « 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

Voici le résultat obtenu : l'élément <ElemQN> de type QName possède désormais une nouvelle valeur :

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

Les instructions suivantes suppriment les objets utilisés dans l'exemple.

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

B.Gestion des limites liées à l'utilisation de la fonction expanded-QName()

La fonction expanded-QName ne peut pas être utilisée dans une construction XML. L'exemple suivant illustre ce comportement. Pour contourner cette limite, l'exemple insère d'abord un nœud, puis le modifie.

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

La tentative suivante d'ajout d'un autre élément <root> se solde par un échec car la fonction n'est pas prise en charge dans la construction XML.

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

Une solution à ce problème consiste à insérer une instance avec une valeur pour l'élément <root> puis à la modifier. Dans cet exemple, une valeur initiale nil est utilisée lorsque l'élément <root> est inséré. La collection de schémas XML utilisée dans cet exemple autorise une valeur nil pour l'élément <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>

Vous pouvez comparer la valeur QName, comme le montre la requête ci-après. Celle-ci renvoie uniquement les éléments <root> dont la valeur correspond à la valeur de type QName renvoyée par la fonction expanded-QName().

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

Limites de la mise en œuvre

Il existe une limite : la fonction expanded-QName() accepte la séquence vide comme second argument et retourne un résultat vide au lieu de déclencher une erreur d'exécution lorsque le second argument est incorrect.

Cela vous a-t-il été utile ?
(1500 caractères restants)
Merci pour vos suggestions.

Ajouts de la communauté

AJOUTER
Afficher:
© 2014 Microsoft