Esempi di importazione ed esportazione bulk di documenti XML (SQL Server)Examples of Bulk Import and Export of XML Documents (SQL Server)

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2016)noDatabase SQL di AzurenoAzure SQL Data WarehousenoParallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

È possibile eseguire importazioni bulk di documenti XML in un database di SQL ServerSQL Server o esportazioni bulk da un database di 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. In questo argomento vengono forniti esempi di entrambe le situazioni.This topic provides examples of both.

Per l'importazione bulk di dati da un file di dati a una tabella di SQL ServerSQL Server o a una vista non partizionata, è possibile utilizzare quanto segue:To bulk import data from a data file into a SQL ServerSQL Server table or non-partitioned view, you can use the following:

  • utilitàbcp bcp utility
    È possibile usare l'utilità bcp anche per esportare dati da qualunque posizione in un database di SQL ServerSQL Server su cui sia possibile usare l'istruzione SELECT, incluse le viste partizionate.You can also use the bcp utility to export data from anywhere in a SQL ServerSQL Server database that a SELECT statement works, including partitioned views.

  • BULK INSERTBULK INSERT

  • INSERT ... SELECT * FROM OPENROWSET(BULK...).INSERT ... SELECT * FROM OPENROWSET(BULK...)

Per ulteriori informazioni, vedere gli argomenti seguenti.For more information, see the following topics.

EsempiExamples

Gli esempi sono i seguenti:The examples are the following:

Importazione bulk di dati XML come flusso di byte binarioBulk importing XML data as a binary byte stream

Quando si esegue un'importazione bulk di dati XML da un file contenente una dichiarazione di codifica che si desidera applicare, specificare l'opzione SINGLE_BLOB nella clausola 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. L'opzione SINGLE_BLOB garantisce che il parser XML di SQL ServerSQL Server importi i dati in base allo schema di codifica specificato nella dichiarazione 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.

Tabella di esempioSample Table

Per testare l'esempio A seguente, creare la tabella di esempio T.To test example A below, create sample table T.

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

File di dati di esempioSample Data File

Prima di eseguire l'esempio A, è necessario creare un file con codifica UTF-8 (C:\SampleFolder\SampleData3.txt) contenente l'istanza di esempio seguente che specifica lo schema di codifica 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>  

Esempio AExample A

In questo esempio viene utilizzata l'opzione SINGLE_BLOB in un'istruzione INSERT ... SELECT * FROM OPENROWSET(BULK...) per importare dati da un file denominato SampleData3.txt e inserire un'istanza XML in una tabella a colonna singola, ovvero la tabella di esempio 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;  

OsservazioniRemarks

L'utilizzo di SINGLE_BLOB in questo caso consente di evitare una mancata corrispondenza tra la codifica del documento XML (come specificata dalla dichiarazione di codifica XML) e la tabella codici della stringa implicita del server.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.

Se si utilizzano tipi di dati NCLOB o CLOB e si verifica un conflitto di tabella codici o di codifica, è necessario eseguire una delle operazioni seguenti:If you use NCLOB or CLOB data types and run into a codepage or encoding conflict, you must do one of the following:

  • Rimuovere la dichiarazione XML per importare correttamente il contenuto del file di dati XML.Remove the XML declaration to successfully import the contents of the XML data file.

  • Specificare una tabella codici nell'opzione CODEPAGE della query corrispondente allo schema di codifica utilizzato nella dichiarazione XML.Specify a code page in the CODEPAGE option of the query that matches the encoding scheme that is used in the XML declaration.

  • Verificare la corrispondenza o risolvere le impostazioni delle regole di confronto del database con uno schema di codifica XML non Unicode.Match, or resolve, the database collation settings with a non-Unicode XML encoding scheme.

    [Torna all'inizio][Top]

Importazione bulk di dati XML in una riga esistenteBulk importing XML data in an existing row

In questo esempio viene utilizzato il provider di set di righe con lettura bulk OPENROWSET per aggiungere un'istanza XML a una o più righe esistenti nella tabella di esempio T.This example uses the OPENROWSET bulk rowset provider to add an XML instance to an existing row or rows in sample table T.

Nota

Per eseguire questo esempio è necessario innanzitutto completare lo script di prova fornito nell'esempio A, nel quale viene creata la tabella tempdb.dbo.T e viene eseguita l'importazione bulk di dati da 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.

File di dati di esempioSample Data File

Nell'esempio B viene utilizzata una versione modificata del file di dati di esempio SampleData3.txt dell'esempio precedente.Example B uses a modified version of the SampleData3.txt sample data file from the preceding example. Per eseguire questo esempio, modificare il contenuto del file nel modo seguente:To run this example, modify the content of this file as follows:

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

Esempio 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  

[Torna all'inizio][Top]

Importazione bulk di dati XML da un file contenente una definizione DTDBulk importing XML data from a file that contains a DTD

Importante

È consigliabile non abilitare il supporto per le definizioni DTD (Document Type Definition) se non è necessario nell'ambiente XML utilizzato.We recommended that you not enable support for Document Type Definitions (DTDs) if it is not required in your XML environment. L'attivazione del supporto DTD aumenta la superficie di attacco del server esposta a rischi e può esporre quest'ultimo a un attacco Denial-of-Service.Turning on DTD support increases the attackable surface area of your server, and may expose it to a denial-of-service attack. Se è necessario abilitare il supporto DTD, è possibile ridurre questo rischio per la sicurezza limitando l'elaborazione a documenti XML attendibili.If you must enable DTD support, you can reduce this security risk by processing only trusted XML documents.

Quando si tenta di usare un comando bcp per importare dati XML da un file contenente una definizione DTD, è possibile che venga visualizzato un errore analogo al seguente: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"

"Error = [Microsoft][SQL Server Native Client][SQL Server]L'analisi di codice XML con DTD di subset interni non è consentita."Error = [Microsoft][SQL Server Native Client][ SQL Server]Parsing XML with internal subset DTDs not allowed. Utilizzare l'istruzione CONVERT con l'opzione di stile 2 per abilitare il supporto limitato per i DTD di subset interni."Use CONVERT with style option 2 to enable limited internal subset DTD support."

"Copia BCP %s non riuscita""BCP copy %s failed"

Per risolvere il problema, è possibile importare dati XML da un file di dati contenente una definizione DTD utilizzando la funzione OPENROWSET(BULK...) e specificando quindi l'opzione CONVERT nella clausola SELECT del comando.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 sintassi di base per il comando è la seguente:The basic syntax for the command is:

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

File di dati di esempioSample Data File

Prima di testare questo esempio di importazione bulk, creare un file (C:\temp\Dtdfile.xml) contenente l'istanza di esempio seguente: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>  

Tabella di esempioSample Table

Nell'esempio C viene utilizzata la tabella di esempio T1 creata mediante l'istruzione CREATE TABLE seguente:Example C uses the T1 sample table that is created by the following CREATE TABLE statement:

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

Esempio CExample C

In questo esempio viene utilizzata la funzione OPENROWSET(BULK...) e viene specificata l'opzione CONVERT nella clausola SELECT per importare i dati XML da Dtdfile.xml nella tabella di esempio 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];  

Dopo l'esecuzione dell'istruzione INSERT , la definizione DTD viene rimossa dai dati XML e archiviata nella tabella T1 .After the INSERT statement executes, the DTD is stripped from the XML and stored in the T1 table.

[Torna all'inizio][Top]

Definizione esplicita del carattere di terminazione del campo tramite un file di formatoSpecifying the field terminator explicitly using a format file

Nell'esempio seguente viene descritta la procedura per l'importazione bulk del documento XML Xmltable.dat.The following example shows how to bulk import the following XML document, Xmltable.dat.

File di dati di esempioSample Data File

Il documento in Xmltable.dat contiene due valori XML, uno per ogni riga.The document in Xmltable.dat contains two XML values, one for each row. Per il primo valore XML è stata utilizzata la codifica UTF-16, mentre per il secondo valore è stata utilizzata la codifica UTF-8.The first XML value is encoded with UTF-16, and the second value is encoded with UTF-8.

Il contenuto di questo file di dati è illustrato nel dump Hex seguente: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*  

Tabella di esempioSample Table

Per l'importazione o l'esportazione bulk di un documento XML, è consigliabile usare un carattere di terminazione del campo che non sia contenuto in alcun documento, ad esempio una serie di quattro valori Null (\0) seguita dalla lettera 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.

In questo esempio viene illustrato come utilizzare questo carattere di terminazione del campo per la tabella di esempio xTable .This example shows how to use this field terminator for the xTable sample table. Per creare questa tabella di esempio, utilizzare l'istruzione CREATE TABLE seguente:To create this sample table, use the following CREATE TABLE statement:

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

File di formato di esempioSample Format File

È necessario specificare il carattere di terminazione del campo nel file di formato.The field terminator must be specified in the format file. Nell'esempio D viene utilizzato un file di formato non XML denominato Xmltable.fmt che contiene quanto segue: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         ""  

È possibile utilizzare tale file di formato per l'importazione bulk di documenti XML nella tabella xTable tramite un comando bcp o un'istruzione BULK INSERT o 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.

Esempio DExample D

In questo esempio viene utilizzato il file di formato Xmltable.fmt in un'istruzione BULK INSERT per importare il contenuto di un file di dati XML denominato 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  

[Torna all'inizio][Top]

Esportazione bulk di dati XMLBulk exporting XML data

Nell'esempio seguente viene utilizzata l'utilità bcp per l'esportazione bulk di dati XML dalla tabella creata nell'esempio precedente tramite lo stesso file di formato 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. Nel comando bcp seguente, <server_name> e <instance_name> rappresentano segnaposto da sostituire con valori appropriati: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>  

Nota

SQL ServerSQL Server non salva la codifica XML in caso di persistenza di dati XML nel database. does not save the XML encoding when XML data is persisted in the database. La codifica originale dei campi XML, pertanto, non è disponibile quando vengono esportati i dati XML.Therefore, the original encoding of XML fields is not available when XML data is exported. SQL ServerSQL Server usa la codifica UTF-16 durante l'esportazione di dati XML. uses UTF-16 encoding when exporting XML data.

Vedere ancheSee Also

INSERT (Transact-SQL) INSERT (Transact-SQL)
Clausola SELECT (Transact-SQL) SELECT Clause (Transact-SQL)
Utilità bcp bcp Utility
Informazioni sull'importazione ed esportazione bulk di dati (SQL Server) Bulk Import and Export of Data (SQL Server)
BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)OPENROWSET (Transact-SQL)