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


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

Применимо к:База данных SQL ServerAzure SQL

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

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

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

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

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

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

  • Никакая информация из пролога XML-документа не учитывается.

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

  • При наличии схемы сопоставления, задающей связь «первичный ключ — внешний ключ» между двумя таблицами (например, между таблицами Customer и CustOrder), таблица, содержащая первичный ключ, должна описываться в схеме первой. Таблица с внешним ключевым столбцом должна располагаться после нее. Причина этого заключается в том, что порядок, в котором таблицы определяются в схеме, является порядком, используемым для их загрузки в базу данных. Например, следующая схема XDR приведет к ошибке при использовании в массовой загрузке XML, так как <элемент 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 игнорирует <элемент 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 сохранит все неиспользоваемые данные в этом столбце.

  • Разделы 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 (то есть 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. Параметру Ignoreduplicatekey следует присвоить значение true только при отправке значений первичного ключа из входящих данных в таблицу со строками и наличием конфликта значений первичного ключа.