다음을 통해 공유


XML 대량 로드에 대한 지침 및 제한 사항(SQLXML 4.0)

적용 대상: SQL ServerAzure SQL Database

XML 대량 로드를 사용하는 경우 다음 지침 및 제한 사항에 대해 잘 알고 있어야 합니다.

  • 인라인 스키마는 지원되지 않습니다.

    원본 XML 문서에 인라인 스키마가 있는 경우 XML 대량 로드에서 해당 스키마를 무시합니다. XML 데이터 외부의 XML 대량 로드에 대한 매핑 스키마를 지정합니다. xmlns="x:schema" 특성을 사용하여 노드에서 매핑 스키마를 지정할 수 없습니다.

  • XML 문서는 형식만 검사되고 유효성은 검사되지 않습니다.

    XML 대량 로드는 XML 문서가 올바른 형식인지 확인하여 XML이 World Wide Web 컨소시엄의 XML 1.0 권장 사항의 구문 요구 사항을 준수하는지 확인합니다. 문서가 잘 구성되지 않으면 XML 대량 로드가 처리를 취소하고 오류를 반환합니다. 유일한 예외는 문서가 조각(예: 문서에 단일 루트 요소가 없는 경우)인 경우입니다. 이 경우 XML 대량 로드가 문서를 로드합니다.

    XML 대량 로드는 XML 데이터 파일 내에서 정의되거나 참조되는 XML 데이터 또는 DTD 스키마와 관련하여 문서의 유효성을 검사하지 않습니다. 또한 XML 대량 로드는 제공된 매핑 스키마에 대해 XML 데이터 파일의 유효성을 검사하지 않습니다.

  • XML 프롤로그 정보는 무시됩니다.

    XML 대량 로드는 XML 문서의 루트> 요소 앞과 뒤의 <모든 정보를 무시합니다. 예를 들어 XML 대량 로드는 XML 선언, 내부 DTD 정의, 외부 DTD 참조, 주석 등을 무시합니다.

  • 두 테이블(예: Customer 테이블과 CustOrder 테이블) 간의 기본 키/외래 키 관계를 정의하는 매핑 스키마가 있는 경우, 스키마에서 기본 키가 들어 있는 테이블 설명이 먼저 나오고 외래 키 열이 있는 테이블은 스키마의 뒷부분에 나타나야 합니다. 그 이유는 테이블이 스키마에서 식별되는 순서가 데이터베이스에 로드하는 데 사용되는 순서이기 때문입니다. 예를 들어 다음 XDR 스키마는 Order> 요소가 Customer> 요소 앞에< 설명되어 있으므로 <XML 대량 로드에서 사용할 때 오류가 발생합니다. CustOrder의 CustomerID 열은 Cust 테이블의 CustomerID 기본 키 열을 참조하는 외래 키 열입니다.

    <?xml version="1.0" ?>  
    <Schema xmlns="urn:schemas-microsoft-com:xml-data"   
            xmlns:dt="urn:schemas-microsoft-com:xml:datatypes"    
            xmlns:sql="urn:schemas-microsoft-com:xml-sql" >  
    
        <ElementType name="Order" sql:relation="CustOrder" >  
          <AttributeType name="OrderID" />  
          <AttributeType name="CustomerID" />  
          <attribute type="OrderID" />  
          <attribute type="CustomerID" />  
        </ElementType>  
    
       <ElementType name="CustomerID" dt:type="int" />  
       <ElementType name="CompanyName" dt:type="string" />  
       <ElementType name="City" dt:type="string" />  
    
       <ElementType name="root" sql:is-constant="1">  
          <element type="Customers" />  
       </ElementType>  
       <ElementType name="Customers" sql:relation="Cust"   
                         sql:overflow-field="OverflowColumn"  >  
          <element type="CustomerID" sql:field="CustomerID" />  
          <element type="CompanyName" sql:field="CompanyName" />  
          <element type="City" sql:field="City" />  
          <element type="Order" >   
               <sql:relationship  
                   key-relation="Cust"  
                    key="CustomerID"  
                    foreign-key="CustomerID"  
                    foreign-relation="CustOrder" />  
          </element>  
       </ElementType>  
    </Schema>  
    
  • 스키마가 sql:overflow-field 주석을 사용하여 오버플로 열을 지정하지 않으면 XML 대량 로드는 XML 문서에 있지만 매핑 스키마에 설명되지 않은 모든 데이터를 무시합니다.

    XML 대량 로드는 XML 데이터 스트림에서 알려진 태그가 발생할 때마다 지정한 매핑 스키마를 적용합니다. 그러나 XML 문서에는 포함되었지만 스키마에 설명되지 않은 데이터는 무시합니다. 예를 들어 Customer> 요소를 설명하는 매핑 스키마가 있다고 <가정합니다. XML 데이터 파일에는 <모든< Customer> 요소를 묶는 AllCustomers> 루트 태그(스키마에 설명되지 않음)가 있습니다.

    <AllCustomers>  
      <Customer>...</Customer>  
      <Customer>...</Customer>  
       ...  
    </AllCustomers>  
    

    이 경우 XML 대량 로드는 <AllCustomers> 요소를 무시하고 Customer> 요소에서 매핑을 <시작합니다. XML 대량 로드는 스키마에 설명되어 있지 않지만 XML 문서에 있는 요소를 무시합니다.

    Order> 요소가 포함된 다른 XML 원본 데이터 파일을 고려합니다<. 이러한 요소는 매핑 스키마에 설명되어 있지 않습니다.

    <AllCustomers>  
      <Customer>...</Customer>  
        <Order> ... </Order>  
        <Order> ... </Order>  
         ...  
      <Customer>...</Customer>  
        <Order> ... </Order>  
        <Order> ... </Order>  
         ...  
      ...  
    </AllCustomers>  
    

    XML 대량 로드는 이러한 <Order> 요소를 무시합니다. 그러나 스키마에서 sql:overflow-field주석을 사용하여 열을 오버플로 열로 식별하는 경우 XML 대량 로드는 이 열에 포함되지 않은 모든 데이터를 저장합니다.

  • CDATA 섹션과 엔터티 참조는 데이터베이스에 저장되기 전에 해당하는 문자열로 변환됩니다.

    이 예제에서 CDATA 섹션은 City> 요소의 값을 <래핑합니다. XML 대량 로드는 City> 요소를 데이터베이스에 삽입하기 전에 문자열 값("NY")을 추출합니다<.

    <City><![CDATA[NY]]> </City>  
    

    XML 대량 로드는 엔터티 참조를 유지하지 않습니다.

  • 매핑 스키마가 특성의 기본값을 지정하고 XML 원본 데이터에 해당 특성이 없는 경우 XML 대량 로드는 기본값을 사용합니다.

    다음 샘플 XDR 스키마는 HireDate 특성에 기본값을 할당합니다.

    <?xml version="1.0" ?>  
    <Schema xmlns="urn:schemas-microsoft-com:xml-data"   
            xmlns:dt="urn:schemas-microsoft-com:xml:datatypes"    
            xmlns:sql="urn:schemas-microsoft-com:xml-sql" >  
       <ElementType name="root" sql:is-constant="1">  
          <element type="Customers" />  
       </ElementType>  
    
       <ElementType name="Customers" sql:relation="Cust3" >  
          <AttributeType name="CustomerID" dt:type="int"  />  
          <AttributeType name="HireDate"  default="2000-01-01" />  
          <AttributeType name="Salary"   />  
    
          <attribute type="CustomerID" sql:field="CustomerID" />  
          <attribute type="HireDate"   sql:field="HireDate"  />  
          <attribute type="Salary"     sql:field="Salary"    />  
       </ElementType>  
    </Schema>  
    

    이 XML 데이터 에서 HireDate 특성은 두 번째 <Customers> 요소에서 누락되었습니다. XML 대량 로드가 데이터베이스에 두 번째 <Customers> 요소를 삽입할 때 스키마에 지정된 기본값을 사용합니다.

    <ROOT>  
      <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" />  
      <Customers CustomerID="2" Salary="10000" />  
    </ROOT>  
    
  • sql:url-encode 주석은 지원되지 않습니다.

    XML 데이터 입력에서 URL을 지정할 수 없으며 대량 로드가 해당 위치에서 데이터를 읽을 것으로 예상할 수 없습니다.

    매핑 스키마에서 식별되는 테이블이 만들어집니다(데이터베이스가 있어야 합니다). 데이터베이스에 하나 이상의 테이블이 이미 있는 경우 SGDropTables 속성은 이러한 기존 테이블을 삭제하고 다시 만들지 여부를 결정합니다.

  • SchemaGen 속성(예: SchemaGen = true)을 지정하면 매핑 스키마에서 식별되는 테이블이 만들어집니다. 그러나 SchemaGen은 이러한 테이블에 대한 제약 조건(예: PRIMARY KEY/FOREIGN KEY 제약 조건)을 만들지 않습니다. 관계에서 기본 키를 구성하는 XML 노드가 XML 형식(즉, XSD의 경우 type="xsd:ID" )을 갖는 것으로 정의되고 SGUseID 속성이 SchemaGen에 대해 True로 설정된 경우 그러면 ID 형식화된 노드에서 기본 키가 생성될 뿐만 아니라 매핑 스키마 관계에서 기본 키/외래 키 관계가 만들어집니다.

  • SchemaGen은 XSD 스키마 패싯 및 확장을 사용하여 관계형 SQL Server 스키마를 생성하지 않습니다.

  • 대량 로드에서 SchemaGen 속성(예: SchemaGen = true)을 지정하면 지정된 테이블(공유 이름 보기가 아님)만 업데이트됩니다.

  • SchemaGen은 주석이 추가된 XSD에서 관계형 스키마를 생성하기 위한 기본 기능만 제공합니다. 필요한 경우 사용자가 생성된 테이블을 수동으로 수정해야 합니다.

  • 테이블 간에 둘 이상의 관계가 있는 경우 SchemaGen은 두 테이블 사이에 관련된 모든 키를 포함하는 단일 관계를 만들려고 합니다. 이 제한은 Transact-SQL 오류의 원인일 수 있습니다.

  • XML 데이터를 데이터베이스로 대량 로드하는 경우 매핑 스키마에 데이터베이스 열에 매핑되는 하나 이상의 특성 또는 자식 요소가 있어야 합니다.

  • XML 대량 로드를 사용하여 날짜 값을 삽입하는 경우 값은 (-)CCYY-MM-DD((+-)TZ) 형식으로 지정해야 합니다. 날짜의 표준 XSD 형식입니다.

  • 일부 속성 플래그는 다른 속성 플래그와 호환되지 않습니다. 예를 들어 대량 로드는 Keepidentity=false와 함께 Ignoreduplicatekeys=true지원하지 않습니다. Keepidentity=false이면 대량 로드에서 서버가 키 값을 생성해야 합니다. 테이블에는 키에 대한 IDENTITY 제약 조건이 있어야 합니다. 서버는 중복 키를 생성하지 않으므로 Ignoreduplicatekeys를 true설정할 필요가 없습니다. Ignoreduplicatekeys는 들어오는 데이터의 기본 키 값을 행이 있는 테이블로 업로드하고 기본 키 값이 충돌할 가능성이 있는 경우에만 true로 설정해야 합니다.