Freigeben über


Richtlinien und Einschränkungen von XML-Massenladen (SQLXML 4.0)

Wenn Sie XML-Massenladen verwenden, sollten Sie mit den folgenden Richtlinien und Einschränkungen vertraut sein:

  • Inlineschemas werden nicht unterstützt.

    Wenn im XML-Quelldokument ein Inlineschema vorhanden ist, wird dieses Schema von XML-Massenladen ignoriert. Sie geben das Zuordnungsschema für XML-Massenladen außerhalb der XML-Daten an. Das Zuordnungsschema an einem Knoten kann nicht mit dem xmlns="x:schema"-Attribut angegeben werden.

  • Es wird überprüft, ob ein XML-Dokument wohlgeformt ist, es wird jedoch nicht überprüft, ob es gültig ist.

    XML-Massenladen überprüft, ob das XML-Dokument wohlgeformt ist, d. h. es wird sichergestellt, dass das XML-Dokument den Syntaxanforderungen der Empfehlung XML 1.0 des World Wide Web Consortium entspricht. Wenn das Dokument nicht wohlgeformt ist, wird die Verarbeitung durch XML-Massenladen abgebrochen und ein Fehler zurückgegeben. Die einzige Ausnahme hierbei stellen Dokumente dar, bei denen es sich um Fragmente handelt (wenn das Dokument beispielsweise kein einzelnes Stammelement aufweist). In diesem Fall wird das Dokument durch XML-Massenladen geladen.

    XML-Massenladen überprüft das Dokument nicht im Hinblick auf XML-Daten oder DTD-Schemas, die in der XML-Datendatei definiert sind oder auf die in der XML-Datendatei verwiesen wird. XML-Massenladen überprüft die XML-Datendatei auch nicht im Hinblick auf das bereitgestellte Zuordnungsschema.

  • Alle XML-Prologinformationen werden ignoriert.

    XML-Massenladen ignoriert alle Informationen vor und nach dem <Stamm>element im XML-Dokument. XML-Massenladen ignoriert beispielsweise sämtliche XML-Deklarationen, internen DTD-Definitionen, externen DTD-Verweise, Kommentare usw.

  • Bei einem Zuordnungsschema, das eine Primärschlüssel-Fremdschlüssel-Beziehung zwischen zwei Tabellen (wie etwa zwischen den Tabellen Customer und CustOrder) definiert, muss die Tabelle mit dem Primärschlüssel im Schema zuerst beschrieben werden. Die Tabelle mit der Fremdschlüsselspalte muss später im Schema angezeigt werden. Das ist deshalb so, weil die Reihenfolge, in der die Tabellen im Schema angegeben sind, die Reihenfolge ist, in der die Tabellen in die Datenbank geladen werden.Beim folgenden XDR-Schema wird beispielsweise ein Fehler generiert, wenn das Schema in XML-Massenladen verwendet wird, da das <Order>-Element vor dem <Customer>-Element beschrieben wird. Die Spalte CustomerID in der Tabelle CustOrder ist eine Fremdschlüsselspalte, die auf die Primärschlüsselspalte CustomerID in der Tabelle Cust verweist.

    <?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>
    
  • Wenn im Schema keine Überlaufspalten mithilfe der sql:overflow-field-Anmerkung angegeben wurden, ignoriert XML-Massenladen Daten, die zwar im XML-Dokument vorhanden, im Zuordnungsschema jedoch nicht beschrieben sind.

    XML-Massenladen wendet das angegebene Zuordnungsschema an, sobald es im XML-Datenstrom auf bekannte Tags trifft. XML-Massenladen ignoriert Daten, die zwar im XML-Dokument vorhanden, im Schema jedoch nicht beschrieben sind. Angenommen, es gibt ein Zuordnungsschema, das ein <Customer>-Element beschreibt. Die XML-Datendatei verfügt über ein <AllCustomers>-Stammtag (das im Schema nicht beschrieben ist), das alle <Customer>-Elemente einschließt:

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

    In diesem Fall ignoriert XML-Massenladen das <AllCustomers>-Element und beginnt beim <Customer>-Element mit der Zuordnung. XML-Massenladen ignoriert die Elemente, die zwar im XML-Dokument vorhanden, im Schema jedoch nicht beschrieben sind.

    Angenommen, eine andere XML-Quelldatendatei enthält <Order>-Elemente. Diese Elemente sind im Zuordnungsschema nicht beschrieben:

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

    XML-Massenladen ignoriert diese <Order>-Elemente. Wenn Sie mit der sql:overflow-field-Anmerkung im Schema jedoch eine Spalte als Überlaufspalte festlegen, speichert XML-Massenladen alle nicht verbrauchten Daten in dieser Spalte.

  • CDATA-Abschnitte und Entitätsverweise werden vor dem Speichern in der Datenbank in das entsprechende Zeichenfolgenäquivalent übersetzt.

    In diesem Beispiel umschließt ein CDATA-Abschnitt den Wert für das <City>-Element. XML-Massenladen extrahiert den Zeichenfolgenwert ("NY"), bevor das <City>-Element in die Datenbank eingefügt wird.

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

    XML-Massenladen behält Entitätsverweise nicht bei.

  • Wenn in einem Zuordnungsschema der Standardwert eines Attributs angegeben ist, verwendet XML-Massenladen dieses Attribut, auch wenn das Attribut in den XML-Quelldaten nicht enthalten ist.

    Im folgenden Beispiel für ein XDR-Schema wird dem HireDate-Attribut ein Standardwert zugewiesen:

    <?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 diesen XML-Daten fehlt das HireDate-Attribut im zweiten <Customers>-Element. Wenn XML-Massenladen das zweite <Customers>-Element in die Datenbank einfügt, wird der im Schema angegebene Standardwert verwendet.

    <ROOT>
      <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" />
      <Customers CustomerID="2" Salary="10000" />
    </ROOT>
    
  • Die sql:url-encode-Anmerkung wird nicht unterstützt:

    Eine in der XML-Dateneingabe angegebene URL wird von Massenladen an diesem Speicherort nicht gelesen.

    Die im Zuordnungsschema angegebenen Tabellen werden erstellt (die Datenbank muss vorhanden sein). Wenn in der Datenbank bereits eine oder mehrere Tabellen vorhanden sind, bestimmt die SGDropTables-Eigenschaft, ob diese bereits vorhandenen Tabellen gelöscht oder neu erstellt werden.

  • Wenn Sie die SchemaGen-Eigenschaft angeben (z. B. SchemaGen = true), werden die im Zuordnungsschema angegebenen Tabellen erstellt. Die SchemaGen-Eigenschaft erstellt für diese Tabellen jedoch keine Einschränkungen (wie etwa die PRIMARY KEY/FOREIGN KEY-Einschränkungen), mit einer Ausnahme: Wenn die XML-Knoten, aus denen der Primärschlüssel besteht, in einer Beziehung so definiert sind, dass sie über eine ID vom Typ XML verfügen (d. h., type="xsd:ID" für XSD) UND wenn die SGUseID-Eigenschaft für SchemaGen auf True festgelegt ist, werden aus den ID-Knoten Primärknoten und aus den Beziehungen im Zuordnungsschema Primärschlüssel-Fremdschlüssel-Beziehungen erstellt.

  • SchemaGen verwendet zum Generieren des relationalen SQL Server-Schemas keine Facets und Erweiterungen des XSD-Schemas.

  • Wenn Sie die SchemaGen-Eigenschaft in Massenladen angeben (z. B. SchemaGen = true), werden nur angegebene Tabellen (keine Sichten von freigegebenen Namen) aktualisiert.

  • SchemaGen stellt nur die grundlegende Funktionalität zum Generieren des relationalen Schemas von XSD mit Anmerkungen bereit. Der Benutzer muss die generierten Tabellen ggf. manuell ändern.

  • Wenn zwischen Tabellen mehr als eine Beziehung besteht, versucht SchemaGen eine einzelne Beziehung zu erstellen, die alle Schlüssel enthält, die an der Beziehung zwischen den beiden Tabellen beteiligt sind. Diese Einschränkung kann die Ursache eines Transact-SQL-Fehlers sein.

  • Beim Massenladen von XML-Daten in eine Datenbank muss mindestens ein Attribut oder ein untergeordnetes Element im Zuordnungsschema vorhanden sein, das einer Datenbankspalte zugeordnet ist.

  • Wenn Sie Datenwerte mithilfe von XML-Massenladen einfügen, müssen die Werte im Format (-)CCYY-MM-DD((+-)TZ) angegeben werden. Dies ist das XSD-Standardformat für das Datum.

  • Einige Eigenschaftenflags sind mit anderen Eigenschaftenflags nicht kompatibel. Beispielsweise wird beim Massenladen Ignoreduplicatekeys=true nicht gleichzeitig mit Keepidentity=false unterstützt. Bei Keepidentity=false wird für das Massenladen erwartet, dass der Server die Schlüsselwerte generiert. Tabellen sollten für den Schlüssel eine IDENTITY-Einschränkung besitzen. Der Server generiert keine doppelten Schlüssel, sodass Ignoreduplicatekeys nicht auf true festgelegt werden muss. Ignoreduplicatekeys sollte nur dann auf true festgelegt werden, wenn Primärschlüsselwerte aus den eingehenden Daten in eine Tabelle mit Zeilen und möglicherweise mit Primärschlüsselwert-Konflikten hochgeladen werden.