Sdílet prostřednictvím


Pokyny a omezení hromadného načítání XML (SQLXML 4.0)

platí pro:SQL Serverazure SQL Database

Při použití hromadného načítání XML byste měli být obeznámeni s následujícími pokyny a omezeními:

  • Vložená schémata nejsou podporována.

    Pokud máte vložené schéma ve zdrojovém dokumentu XML, hromadné načtení XML toto schéma ignoruje. Určíte schéma mapování pro hromadné načtení XML externích dat XML. Schéma mapování na uzlu nelze zadat pomocí atributu xmlns="x:schema" .

  • Dokument XML se kontroluje tak, aby byl správně vytvořený, ale není ověřen.

    Hromadné načtení XML zkontroluje dokument XML a určí, zda je správně formátován, aby zajistil, že XML odpovídá požadavkům syntaxe doporučení XML 1.0 konsorcia World Wide Web Consortium. Pokud dokument není správně vytvořený, hromadné načtení XML zruší zpracování a vrátí chybu. Jedinou výjimkou je, když je dokument fragmentem (například dokument neobsahuje jediný kořenový prvek), v takovém případě se dokument načte hromadným načtením XML.

    Hromadné načtení XML neověřuje dokument s ohledem na žádné XML-Data nebo DTD schéma, které je definováno nebo odkazováno v rámci datového souboru XML. Hromadné načtení XML navíc neověřuje datový soubor XML na zadaném schématu mapování.

  • Všechny informace o protokolu XML se ignorují.

    Hromadné načtení XML ignoruje všechny informace před a za <kořenovým> elementem v dokumentu XML. Například hromadné načítání XML ignoruje všechny deklarace XML, interní definice DTD, externí odkazy DTD, komentáře atd.

  • Pokud máte schéma mapování, které definuje relaci primárního klíče nebo cizího klíče mezi dvěma tabulkami (například mezi Zákazníkem a CustOrder), musí být tabulka s primárním klíčem popsána jako první ve schématu. Tabulka se sloupcem cizího klíče se musí objevit později ve schématu. Důvodem je, že pořadí, ve kterém jsou tabulky identifikovány ve schématu, je pořadí, které se používá k jejich načtení do databáze. Například následující schéma XDR způsobí chybu při použití v hromadném načtení XML, protože<> order element je popsán před <elementEm Customer>. Sloupec CustomerID v CustOrder je sloupec cizího klíče, který odkazuje na sloupec primárního klíče CustomerID v tabulce 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>  
    
  • Pokud schéma neurčuje sloupce přetečení pomocí anotace sql:overflow-field , hromadné načtení XML ignoruje všechna data, která jsou přítomna v dokumentu XML, ale není popsána ve schématu mapování.

    Hromadné načtení XML použije schéma mapování, které jste zadali při každém výskytu známých značek v datovém proudu XML. Ignoruje data, která jsou přítomna v dokumentu XML, ale nejsou popsána ve schématu. Předpokládejme například, že máte schéma mapování, které popisuje <prvek Zákazník> . Datový soubor XML má <kořenovou značku AllCustomers> (která není popsaná ve schématu), která uzavře všechny <prvky zákazníka> :

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

    V tomto případě xml Bulk Load ignoruje <AllCustomers> element a začne mapování u <Customer> elementu. Hromadné načtení XML ignoruje prvky, které nejsou popsány ve schématu, ale jsou přítomné v dokumentu XML.

    Zvažte jiný datový soubor zdroje XML, který obsahuje <elementy Order> . Tyto prvky nejsou popsány ve schématu mapování:

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

    Hromadné načtení XML ignoruje tyto <prvky pořadí> . Pokud ale ve schématu použijete anotaci sql:overflow-field k identifikaci sloupce jako přetečení, uloží hromadné načítání XML všechna nekonsumovaná data v tomto sloupci.

  • Oddíly CDATA a odkazy na entity se před uložením v databázi překládají na jejich řetězcové ekvivalenty.

    V tomto příkladu část CDATA zabalí hodnotu prvku <City> . Hromadné načtení XML extrahuje řetězcovou hodnotu ("NY") před vložením <prvku City> do databáze.

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

    Hromadné načítání XML nezachová odkazy na entity.

  • Pokud schéma mapování určuje výchozí hodnotu atributu a zdrojová data XML neobsahují tento atribut, použije hromadné načtení XML výchozí hodnotu.

    Následující ukázkové schéma XDR přiřadí výchozí hodnotu atributu 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>  
    

    V těchto datech XML chybí atribut HireDate ve druhém <prvku Customers> . Když hromadné načtení XML vloží druhý <prvek Customers> do databáze, použije výchozí hodnotu, která je zadána ve schématu.

    <ROOT>  
      <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" />  
      <Customers CustomerID="2" Salary="10000" />  
    </ROOT>  
    
  • Poznámka s kódováním sql:url není podporována:

    Do vstupu dat XML nelze zadat adresu URL a očekáváte, že hromadné načtení bude číst data z daného umístění.

    Vytvoří se tabulky, které jsou identifikovány ve schématu mapování (databáze musí existovat). Pokud jedna nebo více tabulek již v databázi existuje, vlastnost SGDropTables určuje, zda mají být tyto existující tabulky vyřazeny a znovu vytvořeny.

  • Pokud zadáte vlastnost SchemaGen (například SchemaGen = true), vytvoří se tabulky, které jsou identifikovány ve schématu mapování. SchemaGen ale nevytvoří žádná omezení (například omezení PRIMÁRNÍHO KLÍČE nebo CIZÍHO KLÍČE) u těchto tabulek s jednou výjimkou: Pokud jsou uzly XML, které tvoří primární klíč v relaci, definovány jako typ XML ID (to znamená type="xsd:ID" pro XSD) A vlastnost SGUseID je nastavena na Hodnotu True pro SchemaGen, pak se vytvoří nejen primární klíče vytvořené z uzlů s typem ID, ale relace primárního a cizího klíče se vytvoří z mapování relací schématu.

  • SchemaGen nepoužívá omezující vlastnosti schématu XSD a rozšíření ke generování relačního schématu SQL Serveru.

  • Pokud při hromadném načtení zadáte vlastnost SchemaGen (například SchemaGen = true), aktualizují se pouze tabulky (a ne zobrazení sdíleného názvu).

  • SchemaGen poskytuje pouze základní funkce pro generování relačního schématu z anotovaného XSD. V případě potřeby by měl uživatel vygenerované tabulky upravit ručně.

  • Pokud mezi tabulkami existuje více než jedna relace, schemaGen se pokusí vytvořit jednu relaci, která zahrnuje všechny klíče, které jsou součástí těchto dvou tabulek. Toto omezení může být příčinou chyby Transact-SQL.

  • Při hromadném načítání dat XML do databáze musí existovat alespoň jeden atribut nebo podřízený prvek ve schématu mapování, který je namapován na sloupec databáze.

  • Pokud vkládáte hodnoty kalendářních dat pomocí hromadného načtení XML, musí být hodnoty zadány ve formátu (-)CCYY-MM-DD((+-)TZ). Toto je standardní formát XSD pro datum.

  • Některé příznaky vlastností nejsou kompatibilní s jinými příznaky vlastností. Hromadné načtení například nepodporuje Ignoreduplicatekeys=true společně s keepidentity=false. Když keepidentity=false, hromadné načtení očekává, že server vygeneruje hodnoty klíče. Tabulky by měly mít pro klíč omezení IDENTITY . Server nebude generovat duplicitní klíče, což znamená, že není nutné nastavit ignorovat duplicitní klíče na hodnotu true. Ignoreduplicatekeys by měly být nastaveny na true pouze při nahrávání hodnot primárního klíče z příchozích dat do tabulky, která obsahuje řádky a existuje potenciál pro konflikt hodnot primárního klíče.