XML 문서 대량 가져오기 및 내보내기 예(SQL Server)Examples of Bulk Import and Export of XML Documents (SQL Server)

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터 시작)아니요Azure SQL 데이터베이스아니요Azure SQL 데이터 웨어하우스아니요병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

XML 문서를 SQL ServerSQL Server 데이터베이스로 대량 가져오거나 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. 이 항목에서는 이 두 가지 경우에 대한 예를 제공합니다.This topic provides examples of both.

다음을 사용하여 데이터 파일의 데이터를 SQL ServerSQL Server 테이블 또는 분할되지 않은 뷰로 대량 가져올 수 있습니다.To bulk import data from a data file into a SQL ServerSQL Server table or non-partitioned view, you can use the following:

Examples

다음과 같은 예가 제공됩니다.The examples are the following:

XML 데이터를 이진 바이트 스트림으로 대량 가져오기Bulk importing XML data as a binary byte stream

적용할 인코딩 선언이 있는 파일에서 XML 데이터를 대량으로 가져오는 경우 OPENROWSET(BULK…) 절에 SINGLE_BLOB 옵션을 지정합니다.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. SINGLE_BLOB 옵션은 SQL ServerSQL Server 의 XML 파서가 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.

예제 테이블Sample Table

아래의 예제 A를 테스트하려면 T예제 테이블을 만듭니다.To test example A below, create sample table T.

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

예제 데이터 파일Sample Data File

예제 A를 실행하려면 먼저C:\SampleFolder\SampleData3.txt인코딩 체계를 지정하는 다음 예제 인스턴스가 포함된 UTF-8 인코딩 파일( 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>  

예 1Example A

이 예에서는 SINGLE_BLOB 문에 INSERT ... SELECT * FROM OPENROWSET(BULK...) 옵션을 사용하여 SampleData3.txt 라는 파일에서 데이터를 가져오고 단일 열 테이블( T예제 테이블)에 XML 인스턴스를 삽입합니다.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;  

주의Remarks

이 경우 SINGLE_BLOB을 사용하면 XML 인코딩 선언에 지정된 XML 문서의 인코딩과 서버가 적용한 문자열 코드 페이지 간 불일치를 피할 수 있습니다.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.

NCLOB 또는 CLOB 데이터 형식을 사용할 경우 코드 페이지 또는 인코딩 충돌이 발생하면 다음 중 하나를 수행해야 합니다.If you use NCLOB or CLOB data types and run into a codepage or encoding conflict, you must do one of the following:

  • XML 데이터 파일의 내용을 성공적으로 가져오기 위해 XML 선언을 제거합니다.Remove the XML declaration to successfully import the contents of the XML data file.

  • XML 선언에 사용된 인코딩 체계와 일치하는 쿼리의 CODEPAGE 옵션에 코드 페이지를 지정합니다.Specify a code page in the CODEPAGE option of the query that matches the encoding scheme that is used in the XML declaration.

  • 데이터베이스 데이터 정렬 설정을 비유니코드 XML 인코딩 체계에 맞추거나 불일치를 해결합니다.Match, or resolve, the database collation settings with a non-Unicode XML encoding scheme.

    [맨 위로 이동][Top]

기존 행에 XML 데이터 대량 가져오기 Bulk importing XML data in an existing row

이 예에서는 OPENROWSET 대량 행 집합 공급자를 사용하여 T예제 테이블의 기존 행에 XML 인스턴스를 추가합니다.This example uses the OPENROWSET bulk rowset provider to add an XML instance to an existing row or rows in sample table T.

참고

이 예를 실행하려면 예 1에서 제공한 테스트 스크립트를 먼저 완료해야 합니다. 해당 예는 tempdb.dbo.T 테이블을 만들고 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.

예제 데이터 파일Sample Data File

예 2에서는 앞의 예에서 사용된 SampleData3.txt 예제 데이터 파일의 수정된 버전을 사용합니다.Example B uses a modified version of the SampleData3.txt sample data file from the preceding example. 이 예를 실행하려면 다음과 같이 이 파일의 내용을 수정합니다.To run this example, modify the content of this file as follows:

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

예 2Example 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  

[맨 위로 이동][Top]

DTD가 포함된 파일에 있는 XML 데이터 대량 가져오기 Bulk importing XML data from a file that contains a DTD

중요

XML 환경에서 반드시 필요한 경우가 아니면 DTD(문서 유형 정의)에 대한 지원을 설정하지 않는 것이 좋습니다.We recommended that you not enable support for Document Type Definitions (DTDs) if it is not required in your XML environment. DTD 지원을 설정하면 서버가 공격 받을 수 있는 노출 영역이 증가하며 서비스 거부 공격에 노출될 수 있습니다.Turning on DTD support increases the attackable surface area of your server, and may expose it to a denial-of-service attack. DTD 지원을 설정해야 할 경우에는 신뢰할 수 있는 XML 문서만 처리하여 이러한 보안 위험을 줄일 수 있습니다.If you must enable DTD support, you can reduce this security risk by processing only trusted XML documents.

bcp 명령을 사용하여 DTD가 들어 있는 파일에서 XML 데이터를 가져오려고 하면 다음과 유사한 오류가 발생할 수 있습니다.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"

"오류 = [Microsoft][SQL Server Native Client][ SQL Server]내부 하위 집합 DTD를 사용하여 XML 구문 분석을 수행할 수 없습니다."Error = [Microsoft][SQL Server Native Client][ SQL Server]Parsing XML with internal subset DTDs not allowed. CONVERT에 스타일 옵션 2를 사용하여 제한된 내부 하위 집합 DTD 지원을 활성화하십시오."Use CONVERT with style option 2 to enable limited internal subset DTD support."

"BCP 복사 %s이(가) 실패했습니다.""BCP copy %s failed"

이 문제를 해결하려면 OPENROWSET(BULK...) 함수를 사용한 다음, 명령의 CONVERT 절에 SELECT 옵션을 지정하여 DTD가 포함된 데이터 파일에서 XML 데이터를 가져올 수 있습니다.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. 명령의 기본 구문은 다음과 같습니다.The basic syntax for the command is:

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

예제 데이터 파일Sample Data File

이 대량 가져오기 예를 테스트하려면 먼저 다음 예제 인스턴스를 포함하는 파일(C:\temp\Dtdfile.xml)을 만들어야 합니다.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>  

예제 테이블Sample Table

예 3에서는 다음 T1 문에 의해 생성된 CREATE TABLE 예제 테이블을 사용합니다.Example C uses the T1 sample table that is created by the following CREATE TABLE statement:

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

예 3Example C

이 예에서는 OPENROWSET(BULK...) 을 사용하고 CONVERT 절에 SELECT 옵션을 지정하여 Dtdfile.xml 의 XML 데이터를 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];  

INSERT 문을 실행하면 XML에서 DTD가 잘리고 T1 테이블에 저장됩니다.After the INSERT statement executes, the DTD is stripped from the XML and stored in the T1 table.

[맨 위로 이동][Top]

서식 파일을 사용하여 명시적으로 필드 종결자 지정 Specifying the field terminator explicitly using a format file

다음 예에서는 XML 문서 Xmltable.dat를 대량으로 가져오는 방법을 보여 줍니다.The following example shows how to bulk import the following XML document, Xmltable.dat.

예제 데이터 파일Sample Data File

Xmltable.dat 의 문서에는 두 개의 XML 값이 있으며 각 행마다 하나의 XML 값을 갖습니다.The document in Xmltable.dat contains two XML values, one for each row. 첫 번째 XML 값은 UTF-16으로 인코딩되고 두 번째 값은 UTF-8로 인코딩됩니다.The first XML value is encoded with UTF-16, and the second value is encoded with UTF-8.

이 데이터 파일의 내용은 다음과 같은 16진수 덤프로 표시됩니다.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*  

예제 테이블Sample Table

XML 문서를 대량으로 가져오거나 내보낼 때는 문서에 나타날 가능성이 없는 필드 종결자 를 사용해야 합니다. 예를 들어 다음과 같이\0: z문자 앞에 오는 일련의 Null( \0\0\0\0z) 4개를 사용할 수 있습니다.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.

이 예에서는 xTable 예제 테이블에 대해 이 필드 종결자를 사용하는 방법을 보여 줍니다.This example shows how to use this field terminator for the xTable sample table. 이 예제 테이블을 만들려면 다음 CREATE TABLE 문을 사용합니다.To create this sample table, use the following CREATE TABLE statement:

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

예제 서식 파일Sample Format File

필드 종결자는 서식 파일에 지정해야 합니다.The field terminator must be specified in the format file. 예 4에서는 다음을 포함하는 Xmltable.fmt 라는 비 XML 서식 파일을 사용합니다.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         ""  

이 서식 파일을 사용하면 xTable 명령이나 bcp 또는 BULK INSERT 문을 사용하여 XML 문서를 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.

예 4Example D

이 예에서는 Xmltable.fmt 문에 BULK INSERT 서식 파일을 사용하여 Xmltable.dat라는 XML 데이터 파일의 내용을 가져옵니다.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  

[맨 위로 이동][Top]

XML 데이터 대량 내보내기 Bulk exporting XML data

다음 예에서는 bcp 를 사용하여 동일한 XML 서식 파일로 앞의 예에서 만든 테이블에서 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. 다음 bcp 명령에서 <server_name><instance_name> 은 적절한 값으로 바꿔야 하는 자리 표시자를 나타냅니다.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>  
참고

SQL ServerSQL Server 에서는 XML 데이터가 데이터베이스에 유지되면 XML 인코딩을 저장하지 않습니다. SQL ServerSQL Server does not save the XML encoding when XML data is persisted in the database. 그러므로 XML 필드의 원래 인코딩은 XML 데이터를 내보내면 사용할 수 없습니다.Therefore, the original encoding of XML fields is not available when XML data is exported. SQL ServerSQL Server 에서는 XML 데이터를 내보낼 때 UTF-16 인코딩을 사용합니다. uses UTF-16 encoding when exporting XML data.

관련 항목:See Also

INSERT(Transact-SQL) INSERT (Transact-SQL)
SELECT 절(Transact-SQL) SELECT Clause (Transact-SQL)
bcp 유틸리티 bcp Utility
데이터 대량 가져오기 및 내보내기(SQL Server) Bulk Import and Export of Data (SQL Server)
BULK INSERT(Transact-SQL) BULK INSERT (Transact-SQL)
OPENROWSET(Transact-SQL) OPENROWSET (Transact-SQL)