Condividi tramite


Linee guida e limitazioni del caricamento bulk XML (SQLXML 4.0)

Quando si usa il caricamento bulk XML, è necessario avere familiarità con le linee guida e le limitazioni seguenti:

  • Gli schemi inline non sono supportati.

    Se nel documento XML di origine è presente uno schema inline, il caricamento bulk XML ignora tale schema. Specificare lo schema di mapping per il caricamento bulk XML esterno ai dati XML. Non è possibile specificare lo schema di mapping in un nodo usando l'attributo xmlns="x:schema".

  • Un documento XML viene controllato per essere ben formato, ma non viene convalidato.

    Il caricamento bulk XML controlla il documento XML per determinare se è ben formato, in modo da garantire che il codice XML sia conforme ai requisiti di sintassi della raccomandazione XML 1.0 del World Wide Web Consortium. Se il documento non è ben formato, il caricamento bulk XML annulla l'elaborazione e restituisce un errore. L'unica eccezione è quando il documento è un frammento (ad esempio, il documento non ha un singolo elemento radice), nel qual caso il caricamento bulk XML caricherà il documento.

    Il caricamento bulk XML non convalida il documento rispetto a qualsiasi XML-Data o schema DTD definito o a cui viene fatto riferimento all'interno del file di dati XML. Inoltre, il caricamento bulk XML non convalida il file di dati XML rispetto allo schema di mapping fornito.

  • Tutte le informazioni sul prologo XML vengono ignorate.

    Il caricamento bulk XML ignora tutte le informazioni prima e dopo l'elemento <radice> nel documento XML. Ad esempio, il caricamento bulk XML ignora le dichiarazioni XML, le definizioni DTD interne, i riferimenti DTD esterni, i commenti e così via.

  • Se si dispone di uno schema di mapping che definisce una relazione chiave primaria/chiave esterna tra due tabelle, ad esempio tra Customer e CustOrder, la tabella con la chiave primaria deve essere descritta per prima nello schema. La tabella con la colonna chiave esterna deve essere visualizzata più avanti nello schema. Il motivo è che l'ordine in cui le tabelle vengono identificate nello schema è l'ordine usato per caricarli nel database. Ad esempio, lo schema XDR seguente genererà un errore quando viene usato nel caricamento bulk XML perché l'elemento Order> viene descritto prima dell'elemento<<Customer>. La colonna CustomerID in CustOrder è una colonna chiave esterna che fa riferimento alla colonna chiave primaria CustomerID nella tabella 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 lo schema non specifica le colonne di overflow utilizzando l'annotazione sql:overflow-field , il caricamento bulk XML ignora tutti i dati presenti nel documento XML ma non vengono descritti nello schema di mapping.

    Il caricamento bulk XML applica lo schema di mapping specificato ogni volta che rileva tag noti nel flusso di dati XML. Ignora i dati presenti nel documento XML, ma non descritti nello schema. Si supponga, ad esempio, di avere uno schema di mapping che descrive un <elemento Customer> . Il file di dati XML ha un <tag radice AllCustomers> (che non è descritto nello schema) che racchiude tutti gli <elementi Customer> :

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

    In questo caso, il caricamento bulk XML ignora l'elemento <AllCustomers> e inizia il mapping all'elemento <Customer> . Il caricamento bulk XML ignora gli elementi non descritti nello schema, ma presenti nel documento XML.

    Si consideri un altro file di dati di origine XML che contiene <elementi Order> . Questi elementi non sono descritti nello schema di mapping:

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

    Il caricamento bulk XML ignora questi <elementi Order> . Tuttavia, se si usa l'annotazione sql:overflow-fieldnello schema per identificare una colonna come colonna di overflow, il caricamento bulk XML archivia tutti i dati non utilizzati in questa colonna.

  • Le sezioni CDATA e i riferimenti alle entità vengono convertiti negli equivalenti di stringhe prima che vengano archiviati nel database.

    In questo esempio una sezione CDATA esegue il wrapping del valore per l'elemento <City> . Il caricamento bulk XML estrae il valore stringa ("NY") prima di inserire l'elemento <City> nel database.

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

    Il caricamento bulk XML non mantiene i riferimenti alle entità.

  • Se lo schema di mapping specifica il valore predefinito per un attributo e i dati di origine XML non contengono tale attributo, il caricamento bulk XML utilizza il valore predefinito.

    Lo schema XDR di esempio seguente assegna un valore predefinito all'attributo 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>  
    

    In questi dati XML l'attributo HireDate non è presente nel secondo <elemento Customers> . Quando il caricamento bulk XML inserisce il secondo <elemento Customers> nel database, usa il valore predefinito specificato nello schema.

    <ROOT>  
      <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" />  
      <Customers CustomerID="2" Salary="10000" />  
    </ROOT>  
    
  • L'annotazione sql:url-encode non è supportata:

    Non è possibile specificare un URL nell'input dei dati XML e prevedere il caricamento bulk per leggere i dati da tale posizione.

    Vengono create le tabelle identificate nello schema di mapping (il database deve esistere). Se nel database esiste già una o più tabelle, la proprietà SGDropTables determina se queste tabelle preesistenti devono essere eliminate e ricreate.

  • Se si specifica la proprietà SchemaGen , ad esempio SchemaGen = true, vengono create le tabelle identificate nello schema di mapping. SchemaGen non crea tuttavia vincoli (ad esempio i vincoli PRIMARY KEY/FOREIGN KEY) in queste tabelle con un'eccezione: se i nodi XML che costituiscono la chiave primaria in una relazione sono definiti come con un tipo XML di ID (ovvero type="xsd:ID" per XSD) E la proprietà SGUseID è impostata su True per SchemaGen, non solo sono le chiavi primarie create dai nodi tipizzato ID, ma le relazioni chiave primaria/chiave esterna vengono create dalle relazioni dello schema di mapping.

  • SchemaGen non usa facet ed estensioni dello schema XSD per generare lo schema relazionale di SQL Server.

  • Se si specifica la proprietà SchemaGen (ad esempio SchemaGen = true) in Caricamento bulk, vengono aggiornate solo le tabelle (e non le viste del nome condiviso).

  • SchemaGen fornisce solo funzionalità di base per la generazione dello schema relazionale da XSD con annotazioni. Se necessario, l'utente deve modificare manualmente le tabelle generate.

  • Se esiste più di una relazione tra tabelle, SchemaGen tenta di creare una singola relazione che includa tutte le chiavi coinvolte tra le due tabelle. Questa limitazione potrebbe essere la causa di un errore di Transact-SQL.

  • Quando si caricano in blocco dati XML in un database, deve essere presente almeno un attributo o un elemento figlio nello schema di mapping mappato a una colonna di database.

  • Se si inseriscono valori di data utilizzando il caricamento bulk XML, i valori devono essere specificati nel formato (-)CCYY-MM-DD((+-)TZ). Questo è il formato XSD standard per la data.

  • Alcuni flag di proprietà non sono compatibili con altri flag di proprietà. Ad esempio, il caricamento bulk non supporta Ignoreduplicatekeys=true insieme a Keepidentity=false. Quando Keepidentity=false, il caricamento bulk prevede che il server generi i valori della chiave. Le tabelle devono avere un IDENTITY vincolo sulla chiave. Il server non genererà chiavi duplicate, il che significa che non è necessario Ignoreduplicatekeys impostare su true. Ignoreduplicatekeys deve essere impostato su true solo quando si caricano valori di chiave primaria dai dati in ingresso in una tabella con righe e si verifica un potenziale conflitto di valori di chiave primaria.