Extraction de données XML
SQL Server conserve le contenu de l'instance XML, mais ne conserve pas les aspects de l'instance XML qui ne sont pas considérés significatifs dans le modèle de données XML. Cela signifie qu'une instance XML extraite peut ne pas être identique à l'instance stockée sur le serveur, mais contiendra les mêmes informations.
Cette rubrique décrit les parties des instances XML qui ne sont pas conservées lorsqu'elles sont stockées dans des bases de données.
Déclaration XML
La déclaration XML d'une instance n'est pas conservée lors du stockage de l'instance dans la base de données. Exemple :
CREATE TABLE T1 (Col1 int primary key, Col2 xml)
GO
INSERT INTO T1 values (1, '<?xml version="1.0" encoding="windows-1252" ?><doc></doc>')
GO
SELECT Col2
FROM T1
Le résultat est <doc/>.
La déclaration XML, telle que <?xml version='1.0'?>, n'est pas conservée en cas de stockage des données XML dans une instance de type de données xml. C'est là la procédure normale. La déclaration XML (<?xml ... ?>) et ses attributs (version/encoding/stand-alone) sont perdus une fois les données converties en type xml. La déclaration XML est traitée comme une directive de l'analyseur XML. Les données XML sont stockées en interne au format ucs-2. Toutes les autres instructions de traitement dans l'instance XML sont conservées.
Ordre des attributs
L'ordre des attributs d'une instance XML n'est pas conservé. Lorsque vous interrogez l'instance XML stockée dans la colonne de type xml, l'ordre des attributs du code XML résultant peut différer de l'ordre utilisé dans l'instance XML d'origine.
Guillemets autour des valeurs d'attributs
Les guillemets et les guillemets simples qui encadrent les valeurs des attributs ne sont pas conservés. Les valeurs des attributs sont stockées sous forme de paire nom et valeur. Les guillemets ne sont pas stockés. En cas d'exécution d'une requête XQuery sur une instance XML, le code XML résultant est sérialisé, et les valeurs des attributs figurent entre guillemets.
DECLARE @x xml
-- Use double quotation marks.
SET @x = '<root a="1" />'
SELECT @x
GO
DECLARE @x xml
-- Use single quotation marks.
SET @x = '<root a=''1'' />'
SELECT @x
GO
Les deux requêtes retournent = <root a="1" />.
Préfixes d'espace de noms
Les préfixes d'espace de noms ne sont pas conservés. Lorsque vous définissez une requête XQuery sur une colonne de type xml, le code XML sérialisé qui en découle peut renvoyer des préfixes d'espace de noms différents.
DECLARE @x xml
SET @x = '<ns1:root xmlns:ns1="abc" xmlns:ns2="abc">
<ns2:SomeElement/>
</ns1:root>'
SELECT @x
SELECT @x.query('/*')
GO
Le préfixe d'espace de noms peut avoir une valeur différente dans le résultat. Exemple :
<p1:root xmlns:p1="abc"><p1:SomeElement/></p1:root>