Partilhar via


Diretrizes e limitações de Carregamento em Massa de XML (SQLXML 4.0)

Ao usar o Carregamento em Massa de XML, você deve estar familiarizado com as diretrizes e limitações a seguir:

  • Não há suporte a esquemas embutidos.

    Se houver um esquema embutido no documento XML de origem, o Carregamento em Massa de XML ignorará esse esquema. Você especifica o esquema de mapeamento para o Carregamento em Massa de XML que é externo aos dados XML. Você não pode especificar o esquema de mapeamento em um nó usando o atributo xmlns="x:schema".

  • Um documento XML é verificado para que esteja bem formado, mas ele não é validado.

    O Carregamento em Massa de XML verifica o documento XML para determinar se ele está bem formado – ou seja, para garantir que o XML se conforme com os requisitos de sintaxe da recomendação feita pelo World Wide Web Consortium para o XML 1.0. Se o documento não estiver bem formado, o Carregamento em Massa de XML cancelará o processamento e retornará um erro. A única exceção é quando o documento é um fragmento (por exemplo, o documento não tem nenhum elemento raiz), caso em que o Carregamento em Massa de XML carregará o documento.

    O Carregamento em Massa de XML não valida o documento com relação a qualquer esquema DTD ou de Dados XML definido ou referenciado no arquivo de dados XML. Além disso, o Carregamento em Massa de XML não valida o arquivo de dados XML com base no esquema de mapeamento fornecido.

  • Quaisquer informações de prólogo XML são ignoradas.

    O Carregamento em Massa de XML ignora toda a informações antes e depois do elemento <raiz> no documento XML. Por exemplo, o Carregamento em Massa de XML ignora qualquer declaração XML, definições de DTD internas, referências de DTD externas, comentários e assim por diante.

  • Se você tiver um esquema de mapeamento que define um relacionamento de chave primária/chave estrangeira entre duas tabelas (como entre Customer e CustOrder), a tabela com a chave primária deverá ser descrita primeiro no esquema. A tabela com a coluna de chave estrangeira deve aparecer depois no esquema. O motivo disso é que a ordem em que as tabelas são identificadas no esquema é aquela usada para carregá-las no banco de dados.Por exemplo, o esquema XDR a seguir produzirá um erro quando for usado no Carregamento em Massa de XML porque o elemento <Order> é descrito antes do elemento <Customer>. A coluna CustomerID em CustOrder é uma coluna de chave estrangeira que se refere à coluna de chave primária CustomerID na tabela 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>
    
  • Se o esquema não especificar colunas de estouro usando a anotação sql:overflow-field, o Carregamento em Massa de XML ignorará todos os dados presentes no documento XML porém não descritos no esquema de mapeamento.

    O Carregamento em Massa de XML aplica o esquema de mapeamento que você especifica sempre que encontra marcas conhecidas no fluxo de dados XML. Ele ignora dados presentes no documento XML mas não descritos no esquema. Por exemplo, suponhamos que você tenha um esquema de mapeamento que descreve um elemento <Customer>. O arquivo de dados XML tem uma marca raiz <AllCustomers> (o que não é descrito no esquema) que inclui todos os elementos <Customer>:

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

    Nesse caso, o Carregamento em Massa de XML ignora o elemento <AllCustomers> e começa o mapeamento no elemento <Customer>. O Carregamento em Massa de XML ignora os elementos não descritos no esquema mas presentes no documento XML.

    Considere outro arquivo de dados de origem XML que contém elementos <Order>. Esses elementos não são descritos no esquema de mapeamento:

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

    O Carregamento em Massa de XML ignora esses elementos <Order>. Mas se você usar a anotação sql:overflow-fieldno esquema para identificar uma coluna como uma coluna de estouro, o Carregamento em Massa de XML armazenará todos os dados não consumidos nessa coluna.

  • As referências de entidade e seções CDATA são traduzidas para os respectivos equivalentes de cadeia de caracteres antes de serem armazenadas no banco de dados.

    Nesse exemplo, uma seção CDATA envolve o valor do elemento <City>. O Carregamento em Massa de XML extrai o valor de cadeia de caracteres ("NY") antes de inserir o elemento <City> no banco de dados.

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

    O Carregamento em Massa de XML não preserva as referências de entidade.

  • Se o esquema de mapeamento especificar o valor padrão de um atributo e os dados de origem XML não contiverem esse atributo, o Carregamento em Massa de XML usará o valor padrão.

    O exemplo de esquema XDR a seguir atribui um valor padrão ao atributo 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>
    

    Nesses dados XML, o atributo HireDate está ausente do segundo elemento <Customers>. Quando o Carregamento em Massa de XML insere o segundo elemento <Customers> no banco de dados, ele usa o valor padrão especificado no esquema.

    <ROOT>
      <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" />
      <Customers CustomerID="2" Salary="10000" />
    </ROOT>
    
  • Não há suporte à anotação sql:url-encode:

    Você não pode especificar uma URL na entrada de dados XML e esperar que o Carregamento em Massa leia os dados desse local.

    São criadas as tabelas identificadas no esquema de mapeamento (o banco de dados precisa existir). Se uma ou mais tabelas já existirem no banco de dados, a propriedade SGDropTables determinará se essas tabelas preexistentes serão descartadas e recriadas.

  • Se você especificar a propriedade SchemaGen (por exemplo, SchemaGen = true), serão criadas as tabelas identificadas no esquema de mapeamento. Mas SchemaGen não cria nenhuma restrição (como as restrições de PRIMARY KEY/FOREIGN KEY) nessas tabelas, com uma única exceção: se os nós XML que constituem a chave primária em um relacionamento forem definidos como tendo um tipo XML de ID (ou seja, type="xsd:ID" para XSD) E, ALÉM DISSO, a propriedade SGUseID for definida como True para SchemaGen, não só as chaves primárias serão criadas a partir dos nós de tipo ID, como também os relacionamentos de chave primária/chave estrangeira serão criados a partir de relacionamentos de esquema de mapeamento.

  • SchemaGen não usa facetas e extensões de esquema XSD para gerar o esquema do SQL Server relacional.

  • Se você especificar a propriedade SchemaGen (por exemplo, SchemaGen = true) no Carregamento em Massa, somente as tabelas (e não os modos de exibição do nome compartilhado) especificadas serão atualizadas.

  • SchemaGen só oferece funcionalidade básica para gerar o esquema relacional do XSD anotado. O usuário deve modificar as tabelas geradas manualmente, se necessário.

  • Onde houver mais de um relacionamento entre as tabelas, SchemaGen tentará criar um único relacionamento que inclui todas as chaves envolvidas entre as duas tabelas. Essa limitação pode causar um erro Transact-SQL.

  • Quando você está carregando em massa os dados XML em um banco de dados, é necessário haver pelo menos um atributo ou elemento filho no esquema de mapeamento que esteja mapeado para uma coluna de banco de dados.

  • Se você estiver inserindo valores de data usando o XML Bulk Load, eles deverão ser especificados no formato (-)CCYY-MM-DD((+-)TZ). Esse é o formato de XSD padrão para a data.

  • Alguns sinalizadores de propriedade não são compatíveis com outros. Por exemplo, o carregamento em massa não aceita Ignoreduplicatekeys=true junto com Keepidentity=false. Quando Keepidentity=false, o carregamento em massa espera o servidor gerar os valores de chave. As tabelas devem ter uma restrição IDENTITY na chave. O servidor não gerará chaves duplicadas, o que significa que não há necessidade de Ignoreduplicatekeys ser definido como true. Ignoreduplicatekeys deve ser definido como true somente ao enviar valores de chave primária dos dados de entrada para uma tabela que tem linhas e se houver um possível conflito dos valores de chave primária.