Charger des données XML

S’applique à :SQL ServerAzure SQL Database

Vous pouvez transférer des données XML dans SQL Server de plusieurs façons. Par exemple :

  • Si vous disposez de vos données dans une colonne [n]text ou image dans une base de données SQL Server, vous pouvez importer la table à l’aide d’Integration Services. Modifiez ensuite le type de colonne en XML à l'aide de l'instruction ALTER TABLE.

  • Vous pouvez copier en bloc vos données à partir d’une autre base de données SQL Server à l’aide de bcp out, puis insérer en bloc les données dans la base de données de version ultérieure à l’aide de bcp in.

  • Si vous avez des données dans des colonnes relationnelles dans une base de données SQL Server, créez une table avec une colonne [n]texte et, éventuellement, une colonne clé primaire pour un identificateur de ligne. Utilisez la programmation côté client pour récupérer les données XML générées sur le serveur par la clause FOR XML et placez-les dans la colonne [n]text . Ensuite, utilisez les techniques citées précédemment pour transférer les données vers une base de données de version ultérieure. Vous pouvez choisir d’écrire directement le code XML dans une colonne XML de la base de données de version ultérieure.

Charger en bloc des données XML

Vous pouvez charger en bloc des données XML dans le serveur à l’aide des fonctionnalités de chargement en bloc de SQL Server, telles que bcp. OPENROWSET vous permet de charger des données dans une colonne XML à partir de fichiers. L’exemple suivant illustre ce point.

Exemple : Charger du code XML à partir de fichiers

Cet exemple montre comment insérer une ligne dans la table T. La valeur de la colonne XML est chargée à partir du fichier C:\MyFile\xmlfile.xml en tant que CLOB et la colonne entière est fournie la valeur 10.

INSERT INTO T
SELECT 10, xCol
FROM    (SELECT *
    FROM OPENROWSET (BULK 'C:\MyFile\xmlfile.xml', SINGLE_BLOB)
AS xCol) AS R(xCol);

Encodage de texte

SQL Server stocke les données XML dans Unicode (UTF-16). Les données XML extraites du serveur se présentent au format UTF-16. Si vous souhaitez un encodage différent, vous devez convertir les données extraites au format voulu. Il arrive que les données XML soient encodées différemment. Si tel est le cas, vous devez prêter une attention particulière au chargement des données. Par exemple :

  • Si votre texte XML est en Unicode (UCS-2, UTF-16), vous pouvez l'affecter à une colonne, une variable ou un paramètre XML sans aucun problème.

  • Si l’encodage n’est pas Unicode et est implicite, en raison de la page de codes source, la page de codes de chaîne de la base de données doit être identique ou compatible avec les points de code que vous souhaitez charger. Si nécessaire, utilisez COLLATE. Si aucune page de codes serveur de la sorte n'existe, vous devez ajouter une déclaration XML explicite mentionnant l'encodage correct.

  • Pour utiliser un encodage explicite, utilisez le type varbinary() , qui n’a aucune interaction avec les pages de codes, ou utilisez un type chaîne de la page de codes appropriée. Ensuite, assignez les données à une colonne, une variable ou un paramètre XML.

Exemple : spécifier explicitement un encodage

Supposons que vous disposez d’un document XML, vcdoc, stocké en tant que varchar(max) qui n’a pas de déclaration XML explicite. L’instruction ci-dessous permet d’ajouter une déclaration XML mentionnant l’encodage « iso8859-1 », de concaténer le document XML, de convertir le résultat au format varbinary(max) de façon à conserver la représentation en octets, puis enfin de le convertir au format XML. Ainsi, le processeur XML peut analyser les données conformément à l'encodage spécifié « iso8859-1 » et générer la représentation UTF-16 correspondante pour les valeurs de chaîne.

SELECT CAST(
CAST (('<?xml version="1.0" encoding="iso8859-1"?>'+ vcdoc) AS VARBINARY (MAX))
AS XML);

Incompatibilités d’encodage de chaîne

Si vous copiez et collez du code XML en tant que littéral de chaîne dans la fenêtre éditeur de requête dans SQL Server Management Studio, vous pouvez rencontrer des incompatibilités d’encodage de chaîne [n]varchar . Tout dépendra de l'encodage de votre instance XML. Dans bien des cas, vous serez amené à supprimer la déclaration XML. Par exemple :

<?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema ...

Vous devez ensuite préfixer la chaîne avec une N instance XML d’Unicode. Par exemple :

-- Assign XML instance to a variable.
DECLARE @X XML
SET @X = N'...'
-- Insert XML instance into an xml type column.
INSERT INTO T VALUES (N'...')
-- Create an XML schema collection
CREATE XML SCHEMA COLLECTION XMLCOLL1 AS N'<xsd:schema ... '

Voir aussi