Поделиться через


Рекомендации и ограничения массовой загрузки XML (SQLXML 4.0)

При использовании массовой загрузки XML необходимо ознакомиться со следующими рекомендациями и ограничениями:

  • Встроенные схемы не поддерживаются.

    Если в исходном XML-документе есть встроенная схема, массовая загрузка XML игнорирует эту схему. Вы указываете схему сопоставления для массовой загрузки XML во внешние xml-данные. Невозможно указать схему сопоставления на узле с помощью атрибута xmlns="x:schema".

  • Xml-документ проверяется на наличие хорошо сформированного документа, но он не проверяется.

    Массовая загрузка XML проверяет XML-документ, чтобы определить, является ли он хорошо сформированным, чтобы обеспечить соответствие XML требованиям синтаксиса рекомендации XML 1.0 консорциума Всемирного веб-консорциума. Если документ не является хорошо сформированным, массовая загрузка XML отменяет обработку и возвращает ошибку. Единственное исключение заключается в том, что документ является фрагментом (например, документ не имеет одного корневого элемента), в этом случае xml Bulk Load загружает документ.

    Массовая загрузка XML не проверяет документ относительно любой схемы XML-Data или DTD, которая определена или ссылается в XML-файле данных. Кроме того, массовая загрузка XML не проверяет XML-файл данных на соответствие предоставленной схеме сопоставления.

  • Все сведения о прологе XML игнорируются.

    Массовая загрузка XML игнорирует все сведения до и после корневого <> элемента в XML-документе. Например, массовая загрузка XML игнорирует все объявления XML, внутренние определения DTD, внешние ссылки DTD, комментарии и т. д.

  • Если у вас есть схема сопоставления, которая определяет связь первичного ключа и внешнего ключа между двумя таблицами (например, между Customer и CustOrder), таблица с первичным ключом должна быть описана в схеме. Таблица со столбцом внешнего ключа должна появиться позже в схеме. Причина этого заключается в том, что порядок, в котором таблицы определены в схеме, — это порядок, используемый для их загрузки в базу данных. Например, следующая схема XDR приведет к ошибке при использовании в XML Bulk Load, так как <элемент Order> описан перед элементом <Customer> . Столбец CustomerID в CustOrder — это столбец внешнего ключа, который ссылается на столбец первичного ключа CustomerID в таблице Cust.

    <?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-файл данных содержит корневой <тег AllCustomers> (который не описан в схеме), который включает все <элементы Customer> :

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

    В этом случае XML Bulk Load игнорирует <элемент AllCustomers> и начинает сопоставление с элементом <Customer> . Массовая загрузка XML игнорирует элементы, которые не описаны в схеме, но присутствуют в XML-документе.

    Рассмотрим другой файл данных источника XML, содержащий <элементы Order> . Эти элементы не описаны в схеме сопоставления:

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

    Массовая загрузка XML игнорирует эти <элементы Order> . Но если вы используете sql:overflow-fieldзаметку в схеме, чтобы определить столбец как столбец переполнения, XML Bulk Load сохраняет все неуправляемые данные в этом столбце.

  • Разделы CDATA и ссылки на сущности претворяются в их строковые эквиваленты, прежде чем они хранятся в базе данных.

    В этом примере раздел CDATA упаковывает значение элемента <City> . Массовая загрузка XML извлекает строковое значение ("NY") перед вставкой <элемента City> в базу данных.

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

    Массовая загрузка XML не сохраняет ссылки на сущности.

  • Если схема сопоставления указывает значение по умолчанию для атрибута, а данные источника XML не содержат этот атрибут, XML Bulk Load использует значение по умолчанию.

    В следующем примере схемы 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 не поддерживается:

    Невозможно указать URL-адрес в входных данных XML и ожидать массовой загрузки для чтения данных из этого расположения.

    Создаются таблицы, определенные в схеме сопоставления (база данных должна существовать). Если одна или несколько таблиц уже существуют в базе данных, свойство SGDropTables определяет, следует ли удалять и повторно создавать эти таблицы.

  • Если указать свойство SchemaGen (например, SchemaGen = true), создаются таблицы, определенные в схеме сопоставления. Но SchemaGen не создает никаких ограничений (например, ограничений PRIMARY KEY/FOREIGN KEY) в этих таблицах с одним исключением: если XML-узлы, составляющие первичный ключ в связи, определяются как идентификатор XML (то есть type="xsd:ID" для XSD), а свойство SGUseID имеет значение True для SchemaGen. затем не только первичные ключи, созданные на основе типовых узлов идентификатора, но и связи первичного и внешнего ключа создаются из связей схемы сопоставления.

  • SchemaGen не использует аспекты и расширения схемы XSD для создания реляционной схемы SQL Server.

  • Если указать свойство SchemaGen (например, SchemaGen = true) для массовой загрузки, обновляются только таблицы (а не представления общего имени).

  • SchemaGen предоставляет только основные функции для создания реляционной схемы из аннотированного XSD. При необходимости пользователь должен изменить созданные таблицы вручную.

  • Где между таблицами существует больше связей, SchemaGen пытается создать одну связь, включающую все ключи, участвующие между двумя таблицами. Это ограничение может быть причиной ошибки Transact-SQL.

  • При массовой загрузке XML-данных в базу данных должен быть по крайней мере один атрибут или дочерний элемент схемы сопоставления, сопоставленный с столбцом базы данных.

  • Если вы вставляете значения дат с помощью массовой загрузки XML, значения должны быть указаны в формате (-)CCYY-MM-DD((+-)TZ. Это стандартный формат XSD для даты.

  • Некоторые флаги свойств несовместимы с другими флагами свойств. Например, массовая загрузка не поддерживается Ignoreduplicatekeys=true вместе с Keepidentity=false. Если Keepidentity=falseмассовая загрузка ожидает, что сервер создаст значения ключей. Таблицы должны иметь IDENTITY ограничение на ключ. Сервер не будет создавать повторяющиеся ключи, что означает, что не требуется Ignoreduplicatekeys устанавливать значение true. Ignoreduplicatekeys следует задать значение true только при отправке значений первичного ключа из входящих данных в таблицу с строками и может возникнуть конфликт значений первичного ключа.