다음을 통해 공유


XML 데이터 로드하기

적용 대상: SQL Server Azure SQL Database

몇 가지 방법으로 XML 데이터를 SQL Server로 이동할 수 있습니다. 예시:

  • SQL Server 데이터베이스의 [n]text 또는 이미지 열에 데이터가 있는 경우 통합 서비스를 사용해 테이블을 가져올 수 있습니다. ALTER TABLE 문을 사용하여 열 유형을 XML로 바꿉니다.

  • bcp out을 사용해 다른 SQL Server 데이터베이스에서 데이터를 대량 복사한 다음 bcp in을 사용해 데이터를 최신 버전의 데이터베이스에 대량 삽입할 수 있습니다.

  • SQL Server 데이터베이스의 관계형 열에 데이터가 있는 경우 [n]text 열, 또 필요한 경우 행 식별자에 대한 기본 키 열을 포함하는 새로운 테이블을 만듭니다. 클라이언트 쪽 프로그래밍을 사용해 FOR XML로 서버에서 생성된 XML을 검색하고 이를 [n]text 열에 씁니다. 그런 다음 앞서 언급한 기법을 사용해 데이터를 최신 버전의 데이터베이스로 이동합니다. 최신 데이터베이스에 있는 XML 열로 XML을 직접 작성하도록 선택할 수 있습니다.

데이터 대량 로드하기

bcp와 같은 SQL Server 대량 로드 기능을 사용해 XML 데이터를 서버에 대량 로드할 수 있습니다. OPENROWSET을 사용하면 데이터를 파일에서 XML 열로 로드할 수 있습니다. 다음 예제에서는 이 항목을 보여줍니다.

예제: 파일에서 XML 로드하기

이 예제는 테이블 T에 하나의 행을 삽입하는 방법을 보여줍니다. XML 열의 값은 파일 C:\MyFile\xmlfile.xml에서 CLOB로 로드되고 정수 열에는 10의 값이 부여됩니다.

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

텍스트 인코딩

SQL Server는 유니코드(UTF-16)로 XML 데이터를 저장합니다. 서버에서 검색된 XML 데이터는 UTF-16 인코딩으로 출력됩니다. 다른 인코딩이 필요한 경우 검색된 데이터에서 필요한 변환을 수행해야 합니다. 일부 경우 XML 데이터는 다른 인코딩으로 표시될 수 있습니다. 이럴 경우에는 데이터를 로드하는 동안 주의를 기울여야 합니다. 예시:

  • 텍스트 XML이 유니코드(UCS-2, UTF-16)로 되어 있는 경우 이를 XML 열, 변수, 매개 변수에 할당하는 데에는 아무런 문제가 없습니다.

  • 인코딩이 유니코드가 아니고 암시적일 경우 소스 코드 페이지로 인해 데이터베이스의 문자열 코드 페이지는 로드하려는 코드 포인트와 동일하거나 호환되어야 합니다. 필요한 경우 COLLATE를 사용합니다. 이러한 서버 코드 페이지가 없는 경우 정확한 인코딩으로 명시적 XML 선언을 추가해야 합니다.

  • 명시적 인코딩을 사용하려면 코드 페이지와 상호 작용하지 않는 varbinary() 형식 또는 적절한 코드 페이지의 문자열 형식을 사용합니다. 그런 다음 XML 열, 변수, 매개 변수에 데이터를 할당합니다.

예제: 명시적으로 인코딩 지정하기

XML 문서 vcdoc가 명시적 XML 선언이 없는 varchar(max)로 저장되었다고 가정해 봅시다. 다음 문은 "iso8859-1" 인코딩으로 XML 선언을 추가하고, XML 문서를 연결하며, 바이트 표현이 유지되도록 결과를 varbinary(max)로 캐스팅한 다음 마지막으로 이것을 XML로 캐스팅합니다. 이러한 방식으로 XML 프로세서는 지정된 인코딩 "iso8859-1"에 따라 데이터를 구문 분석하고 문자열 값에 해당하는 UTF-16 표현을 생성할 수 있습니다.

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

문자열 인코딩 비호환성

XML을 복사한 뒤 이를 SQL Server Management Studio의 쿼리 편집기 창에 문자열 리터럴로 붙여넣으면 [n]varchar 문자열 인코딩 비호환성이 발생할 수 있습니다. 이것은 해당 XML 인스턴스의 인코딩에 따라 달라집니다. 많은 경우 XML 선언을 제거하는 것이 바람직합니다. 예시:

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

다음으로 N을 문자열 앞에 붙여 XML 인스턴스를 유니코드 인스턴스로 만들어야 합니다. 다음은 그 예입니다.

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

참고 항목