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


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

Область применения: SQL Server База данных SQL Azure

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

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

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

  • Проверяется правильность формата XML-документа, но сам документ не проверяется.

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

    Массовая загрузка XML не проверяет документ на соответствие какой-либо схеме DTD или XML-Data, которую содержит или на которую ссылается файл 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 Bulk Load игнорирует любые данные, которые присутствуют в 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 будет использовано значение по умолчанию.

    В следующем примере схемы 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-адрес и ждать, что массовая загрузка XML прочтет данные, находящиеся по этому адресу.

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

  • Если указать свойство SchemaGen (например, SchemaGen = true), создаются таблицы, определенные в схеме сопоставления. Но SchemaGen не создает никаких ограничений (например, ограничений PRIMARY KEY/FOREIGN KEY) в этих таблицах с одним исключением: если XML-узлы, составляющие первичный ключ в связи, определяются как идентификатор XML (т . е. тип ="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.

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