Dela via


Riktlinjer och begränsningar för XML-massinläsning (SQLXML 4.0)

gäller för:SQL ServerAzure SQL Database

När du använder XML-massinläsning bör du känna till följande riktlinjer och begränsningar:

  • Infogade scheman stöds inte.

    Om du har ett infogat schema i XML-källdokumentet ignorerar XML-massinläsning det schemat. Du anger mappningsschemat för XML-massinläsning externt till XML-data. Du kan inte ange mappningsschemat på en nod med hjälp av attributet xmlns="x:schema" .

  • Ett XML-dokument kontrolleras för att vara välformat, men det är inte verifierat.

    XML-massinläsning kontrollerar XML-dokumentet för att avgöra om det är välformat, dvs. för att säkerställa att XML-koden uppfyller syntaxkraven i World Wide Web Consortiums XML 1.0-rekommendation. Om dokumentet inte är välformat avbryter XML-massinläsning bearbetningen och returnerar ett fel. Det enda undantaget är när dokumentet är ett fragment (till exempel att dokumentet inte har något enskilt rotelement), i vilket fall XML-massinläsning läser in dokumentet.

    XML-massinläsning validerar inte dokumentet med avseende på något XML-Data- eller DTD-schema som definieras eller refereras i XML-datafilen. Dessutom validerar XML-massinläsning inte XML-datafilen mot det angivna mappningsschemat.

  • All XML-information ignoreras.

    XML-massinläsning ignorerar all information före och efter <rotelementet> i XML-dokumentet. Xml-massinläsning ignorerar till exempel alla XML-deklarationer, interna DTD-definitioner, externa DTD-referenser, kommentarer och så vidare.

  • Om du har ett mappningsschema som definierar en primärnyckel/sekundärnyckelrelation mellan två tabeller (till exempel mellan Kund och CustOrder) måste tabellen med primärnyckeln beskrivas först i schemat. Tabellen med sekundärnyckelkolumnen måste visas senare i schemat. Anledningen till detta är att den ordning i vilken tabellerna identifieras i schemat är den ordning som används för att läsa in dem i databasen. Följande XDR-schema skapar till exempel ett fel när det används i XML-massinläsning eftersom <orderelementet> beskrivs före <kundelementet> . Kolumnen CustomerID i CustOrder är en sekundärnyckelkolumn som refererar till kolumnen CustomerID-primärnyckel i Cust-tabellen.

    <?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>  
    
  • Om schemat inte anger spillkolumner med hjälp av kommentaren sql:overflow-field ignorerar XML Bulk Load alla data som finns i XML-dokumentet, men beskrivs inte i mappningsschemat.

    XML-massinläsning tillämpar det mappningsschema som du har angett när det påträffar kända taggar i XML-dataströmmen. Den ignorerar data som finns i XML-dokumentet men som inte beskrivs i schemat. Anta till exempel att du har ett mappningsschema som beskriver ett <kundelement> . XML-datafilen har en <AllCustomers-rottagg> (som inte beskrivs i schemat) som omger alla <kundelement> :

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

    I det här fallet ignorerar XML Bulk Load elementet <AllCustomers> och börjar mappa till <kundelementet> . XML-massinläsning ignorerar de element som inte beskrivs i schemat men som finns i XML-dokumentet.

    Överväg en annan XML-källdatafil som innehåller <orderelement> . Dessa element beskrivs inte i mappningsschemat:

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

    XML-massinläsning ignorerar dessa <orderelement> . Men om du använder kommentaren sql:overflow-field i schemat för att identifiera en kolumn som en spillkolumn, lagrar XML Massinläsning alla obekräftade data i den här kolumnen.

  • CDATA-avsnitt och entitetsreferenser översätts till deras strängekvivalenter innan de lagras i databasen.

    I det här exemplet omsluter ett CDATA-avsnitt värdet för elementet <Stad> . XML-massinläsning extraherar strängvärdet ("NY") innan elementet <City> infogas i databasen.

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

    XML-massinläsning bevarar inte entitetsreferenser.

  • Om mappningsschemat anger standardvärdet för ett attribut och XML-källdata inte innehåller det attributet använder XML-massinläsning standardvärdet.

    Följande XDR-exempelschema tilldelar ett standardvärde till attributet 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>  
    

    I dessa XML-data saknas attributet HireDate från elementet Second <Customers> . När XML-massinläsning infogar det andra <kundelementet> i databasen använder det standardvärde som anges i schemat.

    <ROOT>  
      <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" />  
      <Customers CustomerID="2" Salary="10000" />  
    </ROOT>  
    
  • Kommentaren sql:url-encode stöds inte:

    Du kan inte ange en URL i XML-dataindata och förvänta dig massinläsning för att läsa data från den platsen.

    Tabellerna som identifieras i mappningsschemat skapas (databasen måste finnas). Om en eller flera av tabellerna redan finns i databasen avgör egenskapen SGDropTables om de befintliga tabellerna ska tas bort och skapas på nytt.

  • Om du anger egenskapen SchemaGen (till exempel SchemaGen = true) skapas de tabeller som identifieras i mappningsschemat. SchemaGen skapar dock inga begränsningar (till exempel begränsningarna PRIMÄRNYCKEL/SEKUNDÄRNYCKEL) för dessa tabeller med ett undantag: Om XML-noderna som utgör primärnyckeln i en relation definieras som att ha en XML-typ av ID ( d.v.s. type="xsd:ID" för XSD) OCH egenskapen SGUseID är inställd på True för SchemaGen, då skapas inte bara primära nycklar från de ID-typade noderna, utan primärnyckel-/sekundärnyckelrelationer skapas från mappning av schemarelationer.

  • SchemaGen använder inte XSD-schemafasetter och tillägg för att generera relations-SQL Server-schemat.

  • Om du anger egenskapen SchemaGen (till exempel SchemaGen = true) för massinläsning uppdateras endast tabeller (och inte vyer med delat namn).

  • SchemaGen innehåller bara grundläggande funktioner för att generera relationsschemat från kommenterad XSD. Användaren bör ändra de genererade tabellerna manuellt om det behövs.

  • Om det finns fler än en relation mellan tabeller försöker SchemaGen skapa en enda relation som innehåller alla nycklar som ingår mellan de två tabellerna. Den här begränsningen kan vara orsaken till ett Transact-SQL fel.

  • När du massinläsningar av XML-data till en databas måste det finnas minst ett attribut eller underordnat element i mappningsschemat som mappas till en databaskolumn.

  • Om du infogar datumvärden med xml-massinläsning måste värdena anges i formatet (-)CCYY-MM-DD((+-)TZ). Det här är XSD-standardformatet för datumet.

  • Vissa egenskapsflaggor är inte kompatibla med andra egenskapsflaggor. Massinläsning stöder till exempel inte Ignoreduplicatekeys=true tillsammans med Keepidentity=false. När Keepidentity=false förväntar sig massinläsning att servern genererar nyckelvärdena. Tabeller bör ha en identitetsbegränsning för nyckeln. Servern genererar inte dubblettnycklar, vilket innebär att Ignoreduplicatekeys inte behöver anges till true. Ignoreduplicatekeys bör endast anges till true när du laddar upp primärnyckelvärden från inkommande data till en tabell som har rader och det finns en risk för konflikt mellan primärnyckelvärden.