XML 문서 대량 가져오기 및 내보내기 예

XML 문서를 SQL Server 데이터베이스로 대량 가져오거나 SQL Server 데이터베이스에서 대량으로 내보낼 수 있습니다. 이 항목에서는 이 두 가지 경우에 대한 예를 제공합니다.

다음을 사용하여 데이터 파일의 데이터를 SQL Server 테이블 또는 분할되지 않은 뷰로 대량 가져올 수 있습니다.

  • bcp 유틸리티
    bcp 유틸리티를 사용하면 분할된 뷰를 포함하여 SELECT 문이 작동하는 SQL Server 데이터베이스의 모든 위치에서 데이터를 내보낼 수도 있습니다.
  • BULK INSERT
  • INSERT ... SELECT * FROM OPENROWSET(BULK...)

자세한 내용은 bcp 유틸리티를 사용하여 대량 데이터 가져오기 및 내보내기BULK INSERT 또는 OPENROWSET(BULK...)를 사용하여 데이터 대량 가져오기를 참조하십시오.

다음과 같은 예가 제공됩니다.

  • 1. XML 데이터를 이진 바이트 스트림으로 대량 가져오기
  • 2. 기존 행으로 XML 데이터 대량 가져오기
  • 3. DTD가 포함된 파일에 있는 XML 데이터 대량 가져오기
  • 4. 서식 파일을 사용하여 명시적으로 필드 종결자 지정
  • 5. XML 데이터 대량 내보내기

1. XML 데이터를 이진 바이트 스트림으로 대량 가져오기

적용할 인코딩 선언이 있는 파일에서 XML 데이터를 대량으로 가져오는 경우 OPENROWSET(BULK…) 절에 SINGLE_BLOB 옵션을 지정합니다. SINGLE_BLOB 옵션은 SQL Server의 XML 파서가 XML 선언에 지정된 인코딩 체계에 따라 데이터를 가져오도록 합니다.

예제 테이블

예 1을 테스트하려면 T 예제 테이블을 만들어야 합니다.

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

예제 데이터 파일

예 1을 실행하기 전에 UTF-8 인코딩 체계를 지정하는 다음 예제 인스턴스가 포함된 UTF-8 인코딩 파일(C:\SampleFolder\SampleData3.txt)을 만들어야 합니다.

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

예 1

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

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

주의

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

NCLOB 또는 CLOB 데이터 형식을 사용할 경우 코드 페이지 또는 인코딩 충돌이 발생하면 다음 중 하나를 수행해야 합니다.

  • XML 데이터 파일의 내용을 성공적으로 가져오기 위해 XML 선언을 제거합니다.
  • XML 선언에 사용된 인코딩 체계와 일치하는 쿼리의 CODEPAGE 옵션에 코드 페이지를 지정합니다.
  • 데이터베이스 데이터 정렬 설정을 비유니코드 XML 인코딩 체계에 맞추거나 불일치를 해결합니다.

XML 텍스트 인코딩에 대한 자세한 내용은 XML 사용을 위한 최선의 구현 방법을 참조하십시오.

[맨 위]

2. 기존 행에 XML 데이터 대량 가져오기

이 예에서는 OPENROWSET 대량 행 집합 공급자를 사용하여 T 예제 테이블의 기존 행에 XML 인스턴스를 추가합니다.

[!참고] 이 예를 실행하려면 예 1에서 제공한 테스트 스크립트를 먼저 완료해야 합니다. 해당 예는 tempdb.dbo.T 테이블을 만들고 SampleData3.txt에서 데이터를 대량으로 가져옵니다.

예제 데이터 파일

예 2에서는 앞의 예에서 사용된 SampleData3.txt 예제 데이터 파일의 수정된 버전을 사용합니다. 이 예를 실행하려면 다음과 같이 이 파일의 내용을 수정합니다.

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

예 2

-- 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

[맨 위]

3. DTD가 포함된 파일에 있는 XML 데이터 대량 가져오기

ms191184.security(ko-kr,SQL.90).gif보안 정보:
XML 환경에서 반드시 필요한 경우가 아니면 DTD(문서 유형 정의)에 대한 지원을 설정하지 않는 것이 좋습니다. DTD 지원을 설정하면 서버가 공격 받을 수 있는 노출 영역이 증가하며 서비스 거부 공격에 노출될 수 있습니다. DTD 지원을 설정해야 할 경우에는 신뢰할 수 있는 XML 문서만 처리하여 이러한 보안 위험을 줄일 수 있습니다.

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

"SQLState = 42000, NativeError = 6359"

"오류 = [Microsoft][SQL Native Client][SQL Server]내부 하위 집합 DTD를 사용하여 XML 구문 분석을 수행할 수 없습니다. CONVERT에 스타일 옵션 2를 사용하여 제한된 내부 하위 집합 DTD 지원을 활성화하십시오."

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

이 문제를 해결하려면 OPENROWSET(BULK...) 함수를 사용한 다음, 명령의 SELECT 절에 CONVERT 옵션을 지정하여 DTD가 포함된 데이터 파일에서 XML 데이터를 가져올 수 있습니다. 명령의 기본 구문은 다음과 같습니다.

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

예제 데이터 파일

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

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

예제 테이블

예 3에서는 다음 CREATE TABLE 문에 의해 생성된 T1 예제 테이블을 사용합니다.

USE tempdb
CREATE TABLE T1(XmlCol xml);
GO

예 3

이 예에서는 OPENROWSET(BULK...)를 사용하고 SELECT 절에 CONVERT 옵션을 지정하여 Dtdfile.xml의 XML 데이터를 T1 예제 테이블로 가져옵니다.

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

INSERT 문을 실행하면 XML에서 DTD가 잘리고 T1 테이블에 저장됩니다.

[맨 위]

4. 서식 파일을 사용하여 명시적으로 필드 종결자 지정

다음 예에서는 XML 문서 Xmltable.dat를 대량으로 가져오는 방법을 보여 줍니다.

예제 데이터 파일

Xmltable.dat의 문서에는 두 개의 XML 값이 있으며 각 행마다 하나의 XML 값을 갖습니다. 첫 번째 XML 값은 UTF-16으로 인코딩되고 두 번째 값은 UTF-8로 인코딩됩니다.

이 데이터 파일의 내용은 다음과 같은 16진수 덤프로 표시됩니다.

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*

예제 테이블

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

이 예에서는 xTable 예제 테이블에 대해 이 필드 종결자를 사용하는 방법을 보여 줍니다. 이 예제 테이블을 만들려면 다음 CREATE TABLE 문을 사용합니다.

USE tempdb
CREATE TABLE xTable (xCol xml);
GO

예제 서식 파일

필드 종결자는 서식 파일에 지정해야 합니다. 예 4에서는 다음을 포함하는 Xmltable.fmt라는 비 XML 서식 파일을 사용합니다.

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

이 서식 파일을 사용하면 bcp 명령이나 BULK INSERT 또는 INSERT ... SELECT * FROM OPENROWSET(BULK...) 문을 사용하여 XML 문서를 xTable 테이블로 대량 가져올 수 있습니다.

예 4

이 예에서는 BULK INSERT 문에 Xmltable.fmt 서식 파일을 사용하여 Xmltable.dat라는 XML 데이터 파일의 내용을 가져옵니다.

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

[맨 위]

5. XML 데이터 대량 내보내기

다음 예에서는 bcp를 사용하여 동일한 XML 서식 파일로 앞의 예에서 만든 테이블에서 XML 데이터를 대량으로 내보냅니다. 다음 bcp 명령에서 <server_name><instance_name>은 적절한 값으로 바꿔야 하는 자리 표시자를 나타냅니다.

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

[!참고] SQL Server에서는 XML 데이터가 데이터베이스에 유지되면 XML 인코딩을 저장하지 않습니다. 그러므로 XML 필드의 원래 인코딩은 XML 데이터를 내보내면 사용할 수 없습니다. SQL Server에서는 XML 데이터를 내보낼 때 UTF-16 인코딩을 사용합니다.

[맨 위]

참고 항목

개념

대량 데이터 가져오기 및 내보내기
xml 데이터 형식
XML 데이터와 함께 유니코드 사용

관련 자료

INSERT(Transact-SQL)
SELECT 절(Transact-SQL)
bcp 유틸리티
BULK INSERT(Transact-SQL)
OPENROWSET(Transact-SQL)
SQL Server에서 XML 사용

도움말 및 정보

SQL Server 2005 지원 받기

변경 내역

릴리스 내역

2006년 7월 17일

새로운 내용
  • 소개 섹션을 보강했습니다.