Exemples d'importation et d'exportation en bloc de documents XML (SQL Server)Examples of Bulk Import and Export of XML Documents (SQL Server)

CETTE RUBRIQUE S’APPLIQUE À :ouiSQL Server (à partir de la version 2016)nonAzure SQL DatabasenonAzure SQL Data WarehousenonParallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Vous pouvez importer en bloc des documents XML vers une base de données SQL ServerSQL Server ou les exporter en bloc à partir d’une base de données SQL ServerSQL Server .You can bulk import XML documents into a SQL ServerSQL Server database or bulk export them from a SQL ServerSQL Server database. Cette rubrique fournit des exemples de chaque.This topic provides examples of both.

Pour importer des données en bloc à partir d'un fichier de données dans une table ou une vue non partitionnée SQL ServerSQL Server , vous pouvez utiliser les méthodes suivantes :To bulk import data from a data file into a SQL ServerSQL Server table or non-partitioned view, you can use the following:

ExemplesExamples

Voici les exemples :The examples are the following:

Importation en bloc de données XML sous forme de flux d'octets binairesBulk importing XML data as a binary byte stream

Si vous importez en bloc des données XML à partir d'un fichier contenant la déclaration d'encodage à appliquer, spécifiez l'option SINGLE_BLOB dans la clause OPENROWSET(BULK…).When you bulk import XML data from a file that contains an encoding declaration that you want to apply, specify the SINGLE_BLOB option in the OPENROWSET(BULK…) clause. Cette option permet à l’analyseur XML de SQL ServerSQL Server d’importer les données conformément au schéma d’encodage spécifié dans la déclaration XML.The SINGLE_BLOB option ensures that the XML parser in SQL ServerSQL Server imports the data according to the encoding scheme specified in the XML declaration.

Exemple de tableSample Table

Pour tester l’exemple A ci-dessous, créez l’exemple de table T.To test example A below, create sample table T.

USE tempdb  
CREATE TABLE T (IntCol int, XmlCol xml);  
GO  

Fichier de données d'exempleSample Data File

Avant de pouvoir exécuter l’exemple A, vous devez créer un fichier encodé en UTF-8 (C:\SampleFolder\SampleData3.txt) : ce dernier contient l’instance d’exemple suivante qui spécifie le schéma d’encodage UTF-8 .Before you can run example A, you must create a UTF-8 encoded file (C:\SampleFolder\SampleData3.txt) that contains the following sample instance that specifies the UTF-8 encoding scheme.

\<?xml version="1.0" encoding="UTF-8"?>  
<Root>  
          <ProductDescription ProductModelID="5">  
             <Summary>Some Text</Summary>  
          </ProductDescription>  
</Root>  

Exemple AExample A

Cet exemple utilise l'option SINGLE_BLOB dans une instruction INSERT ... SELECT * FROM OPENROWSET(BULK...) pour importer des données à partir d'un fichier nommé SampleData3.txt et insérer une instance XML dans la table de colonne unique, la table d'exemple T.This example uses the SINGLE_BLOB option in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement to import data from a file named SampleData3.txt and insert an XML instance in the single-column table, sample table T.

INSERT INTO T(XmlCol)  
SELECT * FROM OPENROWSET(  
   BULK 'c:\SampleFolder\SampleData3.txt',  
   SINGLE_BLOB) AS x;  

NotesRemarks

En utilisant SINGLE_BLOB dans ce cas, vous évitez toute discordance entre l'encodage du document XML (tel qu'il est spécifié par la déclaration d'encodage XML) et la page de codes de type chaîne inhérente au serveur.By using SINGLE_BLOB in this case, you can avoid a mismatch between the encoding of the XML document (as specified by the XML encoding declaration) and the string codepage implied by the server.

Si vous utilisez les types de données NCLOB ou CLOB et que vous rencontrez un conflit de pages de codes ou d'encodage, effectuez l'une des opérations suivantes :If you use NCLOB or CLOB data types and run into a codepage or encoding conflict, you must do one of the following:

  • supprimer la déclaration XML pour réussir l'importation du contenu du fichier de données XML ;Remove the XML declaration to successfully import the contents of the XML data file.

  • spécifier, dans l'option CODEPAGE de la requête, une page de codes qui correspond au schéma d'encodage utilisé dans la déclaration XML ;Specify a code page in the CODEPAGE option of the query that matches the encoding scheme that is used in the XML declaration.

  • faire coïncider, ou corriger, les paramètres de classement avec un schéma d'encodage XML non-Unicode.Match, or resolve, the database collation settings with a non-Unicode XML encoding scheme.

    [Haut][Top]

Importation en bloc de données XML dans une ligne existante Bulk importing XML data in an existing row

Cet exemple utilise le fournisseur d'ensemble de lignes en bloc OPENROWSET pour ajouter une instance XML à une ligne ou des lignes existantes dans la table d'exemple T.This example uses the OPENROWSET bulk rowset provider to add an XML instance to an existing row or rows in sample table T.

Note

Pour exécuter cet exemple, vous devez d'abord terminer le script de test de l'exemple A. Cet exemple crée la table tempdb.dbo.T et importe des données en bloc à partir de SampleData3.txt.To run this example, you must first complete the test script provided in example A. That example creates the tempdb.dbo.T table and bulk imports data from SampleData3.txt.

Fichier de données d'exempleSample Data File

L'exemple B utilise une version modifiée du fichier de données d'exemple SampleData3.txt à partir de l'exemple précédent.Example B uses a modified version of the SampleData3.txt sample data file from the preceding example. Pour exécuter cet exemple, modifiez le contenu de ce fichier comme suit :To run this example, modify the content of this file as follows:

<Root>  
          <ProductDescription ProductModelID="10">  
             <Summary>Some New Text</Summary>  
          </ProductDescription>  
</Root>  

Exemple BExample B

-- Query before update shows initial state of XmlCol values.  
SELECT * FROM T  
UPDATE T  
SET XmlCol =(  
SELECT * FROM OPENROWSET(  
   BULK 'C:\SampleFolder\SampleData3.txt',  
           SINGLE_BLOB  
) AS x  
)  
WHERE IntCol = 1;  
GO  

[Haut][Top]

Importation en bloc de données XML à partir d'un fichier contenant une DTD Bulk importing XML data from a file that contains a DTD

Important

Il est recommandé de ne pas activer la prise en charge des définitions de type de document (DTD) si celle-ci n'est pas nécessaire à votre environnement XML.We recommended that you not enable support for Document Type Definitions (DTDs) if it is not required in your XML environment. En effet, son activation augmente la zone de surface attaquable de votre serveur qui peut se retrouver exposé à une attaque de déni de service.Turning on DTD support increases the attackable surface area of your server, and may expose it to a denial-of-service attack. Si vous devez activer la prise en charge DTD, vous pouvez réduire ce risque lié à la sécurité en traitant uniquement des documents XML approuvés.If you must enable DTD support, you can reduce this security risk by processing only trusted XML documents.

Si vous essayez d'utiliser une commande bcp pour importer des données XML à partir d'un fichier qui contient une DTD, une erreur semblable à celle-ci peut se produire :During an attempt to use a bcp command to import XML data from a file that contains a DTD, an error similar to the following can occur:

"SQLState = 42000, NativeError = 6359""SQLState = 42000, NativeError = 6359"

"Erreur = [Microsoft][SQL Server Native Client][SQL Server]L'analyse de XML avec des DTD de sous-ensemble internes n'est pas autorisée."Error = [Microsoft][SQL Server Native Client][ SQL Server]Parsing XML with internal subset DTDs not allowed. Utilisez CONVERT avec l'option de style 2 pour permettre une prise en charge limitée des DTD de sous-ensemble internes."Use CONVERT with style option 2 to enable limited internal subset DTD support."

"Échec de la copie BCP %s""BCP copy %s failed"

Pour résoudre ce problème, vous pouvez importer des données XML à partir d'un fichier de données qui contient une DTD à l'aide de la fonction OPENROWSET(BULK...) et en spécifiant l'option CONVERT dans la clause SELECT de la commande.To work around this problem, you can import XML data from a data file that contains a DTD by using the OPENROWSET(BULK...) function and then specifying the CONVERT option in the SELECT clause of the command. La syntaxe de base pour la commande est la suivante :The basic syntax for the command is:

INSERT ... SELECT CONVERT(…) FROM OPENROWSET(BULK...)

Fichier de données d'exempleSample Data File

Avant de pouvoir tester cet exemple d’importation en bloc, créez un fichier (C:\temp\Dtdfile.xml) qui contient l’instance d’exemple suivant :Before you can test this bulk import example, create a file (C:\temp\Dtdfile.xml) that contains the following sample instance:

<!DOCTYPE DOC [<!ATTLIST elem1 attr1 CDATA "defVal1">]><elem1>January</elem1>  

Exemple de tableSample Table

L'exemple C utilise la table d'exemple T1 créée par l'instruction CREATE TABLE suivante :Example C uses the T1 sample table that is created by the following CREATE TABLE statement:

USE tempdb;  
CREATE TABLE T1(XmlCol xml);  
GO  

Exemple CExample C

Cet exemple utilise OPENROWSET(BULK...) et spécifie l'option CONVERT dans la clause SELECT pour importer les données XML à partir du fichier Dtdfile.xml dans la table d'exemple T1.This example uses OPENROWSET(BULK...) and specifies the CONVERT option in the SELECT clause to import the XML data from Dtdfile.xml into sample table T1.

INSERT T1  
  SELECT CONVERT(xml, BulkColumn, 2) FROM   
    OPENROWSET(Bulk 'c:\temp\Dtdfile.xml', SINGLE_BLOB) [rowsetresults];  

Une fois l'instruction INSERT exécutée, la DTD est supprimée du code XML, puis stockée dans la table T1 .After the INSERT statement executes, the DTD is stripped from the XML and stored in the T1 table.

[Haut][Top]

Spécification explicite de la marque de fin de champ à l'aide d'un fichier de format Specifying the field terminator explicitly using a format file

L'exemple suivant montre l'importation en bloc du document XML suivant, Xmltable.dat.The following example shows how to bulk import the following XML document, Xmltable.dat.

Fichier de données d'exempleSample Data File

Le document dans le fichier Xmltable.dat contient deux valeurs XML, une pour chaque ligne.The document in Xmltable.dat contains two XML values, one for each row. La première valeur XML est encodée en UTF-16, et la seconde en UTF-8.The first XML value is encoded with UTF-16, and the second value is encoded with UTF-8.

Le contenu de ce fichier de données est présenté dans le vidage hexadécimal suivant :The contents of this data file are shown in the following Hex dump:

FF FE 3C 00 3F 00 78 00-6D 00 6C 00 20 00 76 00  *..\<.?.x.m.l. .v.*  
65 00 72 00 73 00 69 00-6F 00 6E 00 3D 00 22 00  *e.r.s.i.o.n.=.".*  
31 00 2E 00 30 00 22 00-20 00 65 00 6E 00 63 00  *1...0.". .e.n.c.*  
6F 00 64 00 69 00 6E 00-67 00 3D 00 22 00 75 00  *o.d.i.n.g.=.".u.*  
74 00 66 00 2D 00 31 00-36 00 22 00 3F 00 3E 00  *t.f.-.1.6.".?.>.*  
3C 00 72 00 6F 00 6F 00-74 00 3E 00 A2 4F 9C 76  *\<.r.o.o.t.>..O.v*  
0C FA 77 E4 80 00 89 00-00 06 90 06 91 2E 9B 2E  *..w.............*  
99 34 A2 34 86 00 83 02-92 20 7F 02 4E C5 E4 A3  *.4.4..... ..N...*  
34 B2 B7 B3 B7 FE F8 FF-F8 00 3C 00 2F 00 72 00  *4.........\<./.r.*  
6F 00 6F 00 74 00 3E 00-00 00 00 00 7A EF BB BF  *o.o.t.>.....z...*  
3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31  *\<?xml version="1*  
2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74  *.0" encoding="ut*  
66 2D 38 22 3F 3E 3C 72-6F 6F 74 3E E4 BE A2 E7  *f-8"?><root>....*  
9A 9C EF A8 8C EE 91 B7-C2 80 C2 89 D8 80 DA 90  *................*  
E2 BA 91 E2 BA 9B E3 92-99 E3 92 A2 C2 86 CA 83  *................*  
E2 82 92 C9 BF EC 95 8E-EA 8F A4 EB 88 B4 EB 8E  *................*  
B7 EF BA B7 EF BF B8 C3-B8 3C 2F 72 6F 6F 74 3E  *.........</root>*  
00 00 00 00 7A                                   *....z*  

Exemple de tableSample Table

Durant une importation ou une exportation en bloc d’un document XML, vous devez utiliser une marque de fin de champ qu’il est impossible de trouver dans les documents ; par exemple, une série de quatre valeurs Null (\0) suivie de la lettre z: \0\0\0\0z.When you bulk import or export an XML document, you should use a field terminator that cannot possibly appear in any of the documents; for example, a series of four nulls (\0) followed by the letter z: \0\0\0\0z.

Cet exemple illustre l'utilisation de cette marque de fin de champ pour la table d'exemple xTable .This example shows how to use this field terminator for the xTable sample table. Pour créer cette table d'exemple, utilisez les instructions CREATE TABLE suivantes :To create this sample table, use the following CREATE TABLE statement:

USE tempdb;  
CREATE TABLE xTable (xCol xml);  
GO  

Fichier de format d'exempleSample Format File

Le délimiteur de fin de champ doit être spécifié dans le fichier de format.The field terminator must be specified in the format file. L'exemple D utilise un fichier de format non XML intitulé Xmltable.fmt qui contient le code suivant :Example D uses a non-XML format file named Xmltable.fmt that contains the following:

9.0  
1  
1       SQLBINARY     0       0       "\0\0\0\0z"    1     xCol         ""  

Vous pouvez utiliser ce fichier de format pour importer en bloc des documents XML dans la table xTable à l'aide d'une commande bcp ou d'une instruction BULK INSERT ou INSERT ... SELECT * FROM OPENROWSET(BULK...) .You can use this format file to bulk import XML documents into the xTable table by using a bcp command or a BULK INSERT or INSERT ... SELECT * FROM OPENROWSET(BULK...) statement.

Exemple DExample D

Cet exemple utilise le fichier de format Xmltable.fmt dans une instruction BULK INSERT pour importer le contenu d'un fichier de données XML intitulé Xmltable.dat.This example uses the Xmltable.fmt format file in a BULK INSERT statement to import the contents of an XML data file named Xmltable.dat.

BULK INSERT xTable   
FROM 'C:\Xmltable.dat'  
WITH (FORMATFILE = 'C:\Xmltable.fmt');  
GO  

[Haut][Top]

Exportation en bloc de données XML Bulk exporting XML data

L'exemple suivant utilise la commande bcp pour exporter en bloc des données XML à partir de la table créée dans l'exemple précédent, à l'aide du même fichier de format XML.The following example uses bcp to bulk export XML data from the table that is created in the preceding example by using the same XML format file. Dans la commande bcp suivante, <server_name> et <instance_name> représentent des espaces réservés qui doivent être remplacés par les valeurs appropriées :In the following bcp command, <server_name> and <instance_name> represent placeholders that must be replaced with appropriate values:

bcp bulktest..xTable out a-wn.out -N -T -S<server_name>\<instance_name>  
Note

SQL ServerSQL Server n'enregistre pas l'encodage XML lorsque les données XML sont conservées dans la base de données. SQL ServerSQL Server does not save the XML encoding when XML data is persisted in the database. Par conséquent, l'encodage original des champs XML n'est pas disponible lorsque les données XML sont exportées.Therefore, the original encoding of XML fields is not available when XML data is exported. SQL ServerSQL Server utilise l’encodage UTF-16 durant l’exportation de données XML. uses UTF-16 encoding when exporting XML data.

Voir aussiSee Also

INSERT (Transact-SQL) INSERT (Transact-SQL)
Clause SELECT (Transact-SQL) SELECT Clause (Transact-SQL)
Utilitaire bcp bcp Utility
Importation et exportation en bloc de données (SQL Server) Bulk Import and Export of Data (SQL Server)
BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL) OPENROWSET (Transact-SQL)