Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
XML Bulk Load bearbetar XML-indata och förbereder poster för lämpliga tabeller i Microsoft SQL Server. Logiken i XML Bulk Load avgör när en ny post ska genereras, vilka barnelement eller attributvärden som ska kopieras till postens fält, och när posten är komplett och redo att skickas till SQL Server för insättning.
XML Bulk Load laddar inte in all XML-indata i minnet och producerar inte kompletta postuppsättningar innan data skickas till SQL Server. Detta beror på att XML-indata kan vara ett stort dokument och att ladda hela dokumentet i minnet kan vara dyrt. Istället gör XML Bulk Load följande:
Analyserar kartläggningsschemat och förbereder den nödvändiga exekveringsplanen.
Tillämpar exekveringsplanen på datan i indataströmmen.
Denna sekventiella bearbetning gör det viktigt att tillhandahålla XML-indata på ett specifikt sätt. Du måste förstå hur XML Bulk Load analyserar mappningsschemat och hur processen för postgenerering sker. Med denna förståelse kan du tillhandahålla ett mappningsschema till XML Bulk Load som ger de resultat du vill ha.
XML Bulk Load hanterar vanliga mappningsschema-annotationer, inklusive kolumn- och tabellmappningar (specificerade explicit genom annotationer eller implicit via standardmappningen), samt join-relationer.
Anmärkning
Det antas att du är bekant med annoterade XSD- eller XDR-mappningsscheman. För mer information om scheman, se Introduktion till Annoterade XSD-scheman (SQLXML 4.0) eller Annoterade XDR-scheman (föråldrade i SQLXML 4.0).
För att förstå postgenerering krävs förståelse för följande begrepp:
En nods omfattning
Regel för skivgenerering
Postdelmängd och nyckelordningsregeln
Undantag från regeln om inspelningsgenerering
En nodes omfattning
En nod (ett element eller ett attribut) i ett XML-dokument hamnar i omfattning när XML Bulk Load stöter på den i XML-indataströmmen. För en elementnod för starttaggen elementet in i scope. För en attributnod för attributnamnet attributet inom räckvidd.
En nod lämnar scope när det inte finns mer data för den: antingen vid sluttaggen (i fallet med en elementnod) eller i slutet av ett attributvärde (i fallet med en attributnod).
Regel för skivgenerering
När en nod (element eller attribut) går in i scope finns det en möjlighet att generera en post från den noden. Posten lever så länge den tillhörande noden är inom scope. När noden går utanför räckvidd betraktar XML Bulk Load den genererade posten som komplett (med data) och skickar den till SQL Server för insättning.
Till exempel, betrakta följande XSD-schemafragment:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Customer" sql:relation="Customers" >
<xsd:complexType>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="CompanyName" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Schemat specificerar ett <Customer-element> med attributen CustomerID och CompanyName . sql:relationsannotationen mappar Customer-elementet<> till tabellen Customers.
Betrakta detta fragment av ett XML-dokument:
<Customer CustomerID="1" CompanyName="xyz" />
<Customer CustomerID="2" CompanyName="abc" />
...
När XML Bulk Load tillhandahålls med schemat som beskrivs i föregående stycken och XML-data som indata, bearbetar den noderna (element och attribut) i källdatan enligt följande:
Starttaggen för det första <kundelementet> tar in det elementet i omfattning. Denna nod mappas till tabellen Kunder. Därför genererar XML Bulk Load en post för tabellen Kunder.
I schemat mappas alla attribut för Kundelementet<> till kolumnerna i tabellen Kunder. När dessa attribut går in i scope kopierar XML Bulk Load deras värden till kundposten som redan genereras av moderscopen.
När XML Bulk Load når sluttaggen för kundelementet<> går elementet utanför omfattningen. Detta gör att XML Bulk Load anser posten vara klar och skickar den till SQL Server.
XML Bulk Load följer denna process för varje efterföljande <kundelement> .
Viktigt!
I denna modell, eftersom en post infogas när sluttaggen nås (eller när noden är utanför scope), måste du definiera all data som är kopplad till posten inom nodens scope.
Postdelmängd och nyckelordningsregeln
När du specificerar ett mappningsschema som använder <sql:relationship>, syftar delmängdtermen på mängden poster som genereras på den främmande sidan av relationen. I följande exempel är CustOrder-posterna på den utländska sidan, <sql:relationship>.
Till exempel, anta att en databas innehåller följande tabeller:
Cust (KundID, Företagsnamn, Stad)
CustOrder (Kund-ID, Order-ID)
CustomerID i CustOrder-tabellen är en främmande nyckel som refererar till CustomerID:s primärnyckel i Cust-tabellen.
Betrakta nu XML-vyn som specificeras i följande annoterade XSD-schema. Detta schema använder <sql:relationship> för att specificera relationen mellan Cust- och CustOrder-tabellerna.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="CustCustOrder"
parent="Cust"
parent-key="CustomerID"
child="CustOrder"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customers" sql:relation="Cust" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CustomerID" type="xsd:integer" />
<xsd:element name="CompanyName" type="xsd:string" />
<xsd:element name="City" type="xsd:string" />
<xsd:element name="Order"
sql:relation="CustOrder"
sql:relationship="CustCustOrder" >
<xsd:complexType>
<xsd:attribute name="OrderID" type="xsd:integer" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Exempel på XML-data och stegen för att skapa ett fungerande exempel ges nedan.
När en <Customer> Element-nod i XML-datafilen går in i scope genererar XML Bulk Load en post för Cust-tabellen. XML Bulk Load kopierar sedan de nödvändiga kolumnvärdena (CustomerID, CompanyName och City) från <CustomerID,><CompanyName och City-barnelementen>>när dessa element går in i scope.<
När en <Order-elementnod> går in i scope genererar XML Bulk Load en post för CustOrder-tabellen. XML Bulk Load kopierar värdet av attributet OrderID till denna post. Värdet som krävs för kolumnen CustomerID erhålls från barnelementet< CustomerID i Customer-elementet><>. XML Bulk Load använder informationen som anges i <sql:relationship> för att erhålla CustomerID:s främmande nyckelvärde för denna post, om inte attributet CustomerID specificerades i Order-elementet<>. Den allmänna regeln är att om barnelementet uttryckligen anger ett värde för främmande nyckelattributet, använder XML Bulk Load det värdet och får inte värdet från föräldraelementet genom att använda den angivna <sql:relationship>. När denna <Order-elementnod> går utanför scope, skickar XML Bulk Load posten till SQL Server och bearbetar sedan alla efterföljande <Order-elementnoder> på samma sätt.
Slutligen <går Kundelement-noden> utanför scope. Vid den tidpunkten skickar XML Bulk Load kundposten till SQL Server. XML Bulk Load följer denna process för alla efterföljande kunder i XML-dataströmmen.
Här är två observationer om kartläggningsschemat:
När schemat uppfyller "containment"-regeln (till exempel all data som är kopplad till kunden och ordern definieras inom räckvidden för de associerade <Kund-> och <Orderelement-noderna> ), lyckas bulk-belastningen.
Vid beskrivningen <av Kund-elementet> specificeras dess barn-element i lämplig ordning. I detta fall anges CustomerID-barnelementet<> före <Order-barnelementet>. Detta innebär att i inmatningsfilen <XML är CustomerID-elementvärdet> tillgängligt som främmande nyckelvärde när Order-elementet <> går in i scope. Nyckelattributen specificeras först; detta är "Nyckelordningsregeln."
Om du anger CustomerID-barnelementet<> efter Order-barnelementet <> är värdet inte tillgängligt när Order-elementet <> går in i scope. När /Order-sluttaggen <> sedan läses anses posten för CustOrder-tabellen vara komplett och infogas i CustOrder-tabellen med ett NULL-värde för kolumnen CustomerID, vilket inte är det önskade resultatet.
För att skapa ett arbetsprov
Spara schemat som ges i detta exempel som SampleSchema.xml.
Skapa följande tabeller:
CREATE TABLE Cust ( CustomerID int PRIMARY KEY, CompanyName varchar(20) NOT NULL, City varchar(20) DEFAULT 'Seattle') GO CREATE TABLE CustOrder ( OrderID int PRIMARY KEY, CustomerID int FOREIGN KEY REFERENCES Cust(CustomerID)) GOSpara följande exempel-XML-indata som SampleXMLData.xml:
<ROOT> <Customers> <CustomerID>1111</CustomerID> <CompanyName>Hanari Carnes</CompanyName> <City>NY</City> <Order OrderID="1" /> <Order OrderID="2" /> </Customers> <Customers> <CustomerID>1112</CustomerID> <CompanyName>Toms Spezialitten</CompanyName> <City>LA</City> <Order OrderID="3" /> </Customers> <Customers> <CustomerID>1113</CustomerID> <CompanyName>Victuailles en stock</CompanyName> <Order OrderID="4" /> </Customers> </ROOT>För att köra XML Bulk Load, spara och kör följande exempel på Microsoft Visual Basic Scripting Edition (VBScript) (BulkLoad.vbs):
set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0") objBL.ConnectionString = "provider=SQLOLEDB;data source=localhost;database=tempdb;integrated security=SSPI" objBL.ErrorLogFile = "c:\error.log" objBL.CheckConstraints = True objBL.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml" set objBL=Nothing
Undantag från regeln om inspelningsgenerering
XML Bulk Load genererar inte en post för en nod när den går in i scope om den noden är antingen av IDREF- eller IDREFS-typ. Du måste se till att en fullständig beskrivning av posten finns någonstans i schemat. anteckningarna dt:type="nmtokens" ignoreras, precis som IDREFS-typen ignoreras.
Till exempel, betrakta följande XSD-schema som beskriver <kund-> och <orderelement> . Kundelementet<> inkluderar ett OrderList-attribut av typen IDREFS. Taggen< sql:relationship-koden> specificerar en-till-många-relationen mellan kunden och listan över beställningar.
Detta är schemat:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="CustCustOrder"
parent="Cust"
parent-key="CustomerID"
child="CustOrder"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customers" sql:relation="Cust" >
<xsd:complexType>
<xsd:attribute name="CustomerID" type="xsd:integer" />
<xsd:attribute name="CompanyName" type="xsd:string" />
<xsd:attribute name="City" type="xsd:string" />
<xsd:attribute name="OrderList"
type="xsd:IDREFS"
sql:relation="CustOrder"
sql:field="OrderID"
sql:relationship="CustCustOrder" >
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="Order" sql:relation="CustOrder" >
<xsd:complexType>
<xsd:attribute name="OrderID" type="xsd:string" />
<xsd:attribute name="CustomerID" type="xsd:integer" />
<xsd:attribute name="OrderDate" type="xsd:date" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Eftersom Bulk Load ignorerar noder av IDREFS-typ sker ingen postgenerering när OrderList-attributnoden går in i scope. Därför, om du vill att orderposterna ska läggas till i ordertabellen, måste du beskriva dessa order någonstans i schemat. I detta schema säkerställer angivningen <av Order-elementet> att XML Bulk Load lägger till orderposterna i Order-tabellen. Order-elementet <> beskriver alla attribut som krävs för att fylla posten för CustOrder-tabellen.
Du måste säkerställa att CustomerID och OrderID-värdena i kundelementet<> matchar värdena i <orderelementet>. Du är ansvarig för att upprätthålla referensintegritet.
För att testa ett fungerande prov
Skapa följande tabeller:
CREATE TABLE Cust ( CustomerID int PRIMARY KEY, CompanyName varchar(20) NOT NULL, City varchar(20) DEFAULT 'Seattle') GO CREATE TABLE CustOrder ( OrderID varchar(10) PRIMARY KEY, CustomerID int FOREIGN KEY REFERENCES Cust(CustomerID), OrderDate datetime DEFAULT '2000-01-01') GOSpara mappningsschemat som ges i detta exempel som SampleSchema.xml.
Spara följande exempel-XML-data som SampleXMLData.xml:
<ROOT> <Customers CustomerID="1111" CompanyName="Sean Chai" City="NY" OrderList="Ord1 Ord2" /> <Customers CustomerID="1112" CompanyName="Dont Know" City="LA" OrderList="Ord3 Ord4" /> <Order OrderID="Ord1" CustomerID="1111" OrderDate="1999-01-01" /> <Order OrderID="Ord2" CustomerID="1111" OrderDate="1999-02-01" /> <Order OrderID="Ord3" CustomerID="1112" OrderDate="1999-03-01" /> <Order OrderID="Ord4" CustomerID="1112" OrderDate="1999-04-01" /> </ROOT>För att köra XML Bulk Load, spara och kör detta VBScript-exempel (SampleVB.vbs):
set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0") objBL.ConnectionString = "provider=SQLOLEDB;data source=localhost;database=tempdb;integrated security=SSPI" objBL.ErrorLogFile = "c:\error.log" objBL.CheckConstraints=True objBL.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml" set objBL=Nothing