2009-11-09 2 views
5

엄밀한 스키마 (특히 this one)를 따르는 많은 양의 XML 파일을 구문 분석 할 방법을 찾고 있습니다. 우리가하고 싶은 일은 여러 데이터베이스 테이블과 XML 파일간에 1 대 1 데이터 매핑을 생성하기 때문에 웹 서비스 소프트웨어 패키지가 파일을 삽입하는 테이블에 트리거를 설정 한 다음 자동으로 파싱하고 우리가 정의한대로 데이터를 데이터베이스에 저장합니다.XML-to-SQL 매핑

Microsoft의 SQL Server 및 이와 유사한 영역에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

XML 스키마에 대한 DB 스키마를 자동으로 만들려 하시겠습니까? –

+0

아니요, XML XSD와 별도의 기존 DB 스키마가 있으므로 매핑을 명시 적으로 지정하고 싶습니다. – tearman

답변

1

. 그런 다음 패키지를 실행합니다. 패키지 안에는 스키마, 매핑 등을 지정할 수 있습니다. SSIS에는 "각 파일의 디렉토리에 대해"컨테이너가 있습니다.

0

원하는 것은 SQLServer의 대량 가져 오기 도구에서 사용할 수있는 형식으로 XML을 렌더링하는 XSL 변환을 작성하는 것과 같습니다. (나는 대부분 오라클을 수행하므로 SQLServer 측에서 사용할 수있는 것을 모른다.)

또 다른 옵션은 XML을 SQL 'insert'문으로 변환하고 결과를 SQL 스크립트로 실행하는 것이다.

어느 방법을 선택하든 입력에 오류 또는 잘못된 데이터가 데이터베이스에서 불일치하지 않도록 트랜잭션 경계를 고려하는 것이 중요합니다.

4

SQLXML 대량로드 4.0을 사용하면 XML 파일을 SQL Server 테이블로 대량로드 할 수 있습니다.
SQLXML bulkload 개체는 XML 데이터 파일과 스키마 파일을 사용합니다.

SCHEMA (XSD 또는 XML) 파일에는 XML 노드와 데이터베이스 열 이름 사이에 매핑 정보 이 포함되어 있습니다.

http://msdn.microsoft.com/en-us/library/ms171806.aspx

다음

http://msdn.microsoft.com/en-us/library/ms171878.aspx

set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0") 
objBL.ConnectionString = "Connection String" 
objBL.ErrorLogFile = "c:\error.log" 
objBL.Execute "SampleSchema.xml", "SampleXMLData.xml" 
는 샘플 데이터 파일과 스키마 파일입니다.

데이터 파일

<ROOT> 
    <Order OrderID="11" CustomerID="ALFKI"> 
    <Product ProductID="11" ProductName="Chai" /> 
    <Product ProductID="22" ProductName="Chang" /> 
    </Order> 
    <Order OrderID="22" CustomerID="ANATR"> 
    <Product ProductID="33" ProductName="Aniseed Syrup" /> 
    <Product ProductID="44" ProductName="Gumbo Mix" /> 
    </Order> 
</ROOT> 

스키마 정의 당신은 XML 데이터 소스 (들)과 "ETL 패키지"를 만들기 위해 SSIS를 사용하여 고려할 수

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
<xsd:annotation> 
    <xsd:appinfo> 
    <sql:relationship name="OrderOD" 
      parent="Ord" 
      parent-key="OrderID" 
      child="OrderDetail" 
      child-key="OrderID" /> 

    <sql:relationship name="ODProduct" 
      parent="OrderDetail" 
      parent-key="ProductID" 
      child="Product" 
      child-key="ProductID" 
      inverse="true"/> 
    </xsd:appinfo> 
</xsd:annotation> 

    <xsd:element name="Order" sql:relation="Ord" 
          sql:key-fields="OrderID" > 
    <xsd:complexType> 
    <xsd:sequence> 
     <xsd:element name="Product" sql:relation="Product" 
        sql:key-fields="ProductID" 
        sql:relationship="OrderOD ODProduct"> 
      <xsd:complexType> 
      <xsd:attribute name="ProductID" type="xsd:int" /> 
      <xsd:attribute name="ProductName" type="xsd:string" /> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
     <xsd:attribute name="OrderID" type="xsd:integer" /> 
     <xsd:attribute name="CustomerID" type="xsd:string" /> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

SQLXMLBulkLoad는 상대적으로 적은 양의 XML 파일을 처리하는 시나리오에서 심각한 성능 문제를 일으키는 것으로 알려져 있습니다. 그 이유는 내부적으로 각 파일을 처리하기위한 임시 스테이징 테이블을 많이 생성하기 때문입니다. 이를 피하려면 한 번에 일부 XML 파일을 병합하고 대량로드해야합니다. 또한 모든 파일이 로컬 드라이브에 있는지 확인하십시오. –