Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Az XML Bulk Load feldolgozza az XML bemeneti adatokat, és előkészíti a megfelelő táblákhoz a Microsoft SQL Serverben. Az XML Bulk Load logikája határozza meg, mikor generálnak új rekordot, mely gyermekelem vagy attribútumértékeket kell bemásolni a rekord mezőibe, illetve mikor készül a rekord elküldése az SQL Serverbe való beillesztéshez.
Az XML Bulk Load nem tölti be az egész XML bemeneti adatot a memóriába, és nem hoz létre teljes rekordhalmazokat az adatok küldése előtt az SQL Servernek. Ez azért van, mert az XML bemeneti adatok nagy dokumentumot jelenthetnek, és az egész dokumentum memóriába történő betöltése költséges lehet. Ehelyett az XML Bulk Load a következőket végzi:
Elemzi a leképezési sémát és elkészíti a szükséges végrehajtási tervet.
Alkalmazza a végrehajtási tervet a bemeneti áram adataira.
Ez a szekvenciális feldolgozás fontossá teszi, hogy az XML bemeneti adatokat egy adott módon szolgáljanak. Meg kell értened, hogyan elemzi az XML Bulk Load a leképezési sémát, és hogyan zajlik a rekordgenerálási folyamat. Ezzel a megértéssel egy XML Bulk Load-ra való leképezési sémát adhatsz elő, amely a kívánt eredményeket hozza.
Az XML Bulk Load kezeli a gyakori leképezési séma annotációkat, beleértve az oszlop- és táblaleképezéseket (amelyeket kifejezetten annotációk használatával vagy implicit módon az alapértelmezett leképezéssel jelöltek meg), valamint a csatlakozási kapcsolatokat.
Megjegyzés:
Feltételezhető, hogy ismered az annotált XSD vagy XDR leképezési sémákat. További információért a sémákkal kapcsolatos további információkért lásd: Bevezetés az Annotált XSD sémákhoz (SQLXML 4.0) vagy az Annotált XDR sémákhoz (az SQLXML 4.0-ban elavult) című részben.
A rekordgenerálás megértéséhez a következő fogalmak megértése szükséges:
Egy csomópont hatóköre
Rekordgenerálási szabály
Rekord részhalmaz és a kulcssorrendi szabály
Kivételek a lemezgenerálási szabályból
Egy csomópont terjedelme
Egy csomópont (elem vagy attribútum) egy XML dokumentumban akkor kerül a hatókörbe , amikor az XML Bulk Load találkozik vele az XML bemeneti adatfolyamban. Egy elemcsomópont esetén az elem kezdő címkéje hozza az elemet a scope-ba. Egy attribútumcsomópont esetén az attribútumnév az attribútumot a hatókörbe hozza.
Egy csomópont akkor hagyja el a teremét, ha nincs több adat számára: akár a végcímkénél (elemcsomópont esetén), akár egy attribútumérték végén (attribútumcsomópont esetén).
Rekordgenerálási szabály
Amikor egy csomópont (elem vagy attribútum) bekerül a hatókörbe, lehetőség van arra, hogy ebből rekordot generáljunk. A rekord addig él, amíg a kapcsolódó csomópont a hatótávban van. Amikor a csomópont kikerül a hatókörből, az XML Bulk Load a generált rekordot teljesnek (adatokkal együtt) tekinti, és elküldi az SQL Servernek beillesztésre.
Például vegyük a következő XSD séma töredéket:
<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>
A séma egy <ügyfélelemet> jelöl meg CustomerID és CompanyName attribútumokkal. A sql:relation annotáció az <Ügyfél> elemet az Ügyfelek táblára képezi.
Vegyük ezt az XML dokumentum töredékét:
<Customer CustomerID="1" CompanyName="xyz" />
<Customer CustomerID="2" CompanyName="abc" />
...
Amikor az XML Bulk Load az előző bekezdésekben leírt sémával és XML adatokkal érkezik bemenetként, akkor a forrásadatban lévő csomópontokat (elemeket és attribútumokat) a következőképpen dolgozza fel:
Az első <ügyfélelem> kezdő címkéje ezt az elemet a hatókörbe helyezi. Ez a csomópont a Vevők táblához fordul. Ezért az XML Bulk Load rekordot generál az Ügyfelek táblához.
A sémában az Ügyfélelem> összes attribútumja< az Ügyfelek tábla oszlopaihoz fordul. Ahogy ezek az attribútumok lépnek a hatókörbe, az XML Bulk Load lemásolja értékeiket az ügyfél rekordjába, amelyet már generált a szülő scope.
Amikor az XML Bulk Load eléri a Customer> elem végcímkéjét<, az elem kikerül a hatótávon. Ez arra készteti, hogy az XML Bulk Load befejezettnek tekinti a rekordot, és elküldi az SQL Servernek.
Az XML Bulk Load ezt a folyamatot követi minden további <ügyfélelem> esetén.
Fontos
Ebben a modellben, mivel a rekordot akkor helyezik be, amikor elérjük a végcímkét (vagy a csomópont kívül esik a hatókörből), akkor meg kell határoznod az összes adatot, amely a rekordhoz kapcsolódik a csomópont hatókörén belül.
Rekord részhalmaz és a kulcssorrendi szabály
Amikor olyan leképezési sémát jelölsz, amely sql:relationship-et> használ<, az alhalmaz kifejezés arra a rekordhalmazra utal, amely a kapcsolat idegen oldalán generált. A következő példában a CustOrder rekordok az idegen oldalon, <sql:relationship-en> találhatók.
Például, tegyük fel, hogy egy adatbázis tartalmazza a következő táblákat:
Cust (CustomerID, Cégnév, Város)
CustOrder (CustomerID, OrderID)
A CustOrder táblában található CustomerID egy idegen kulcs, amely a Cust táblázatban található CustomerID elsődleges kulcsra utal.
Most vegyük az XML nézetet, ahogy az alábbi annotált XSD séma is meghatározza. Ez a séma <a sql:relationship> segítségével határozza meg a Cust és CustOrder táblák közötti kapcsolatot.
<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>
Az alábbiakban a mintaXML adatok és a munkaminta létrehozásának lépései találhatók.
Amikor egy <ügyfélelem> csomópontja az XML adatfájlban lép be a hatókörbe, az XML Bulk Load rekordot generál a Cust táblához. Az XML Bulk Load ezután lemásolja a szükséges oszlopértékeket (CustomerID, CompanyName és City) a <CustomerID-ből>, <CompanyName>és City<> gyermekelemekről, ahogy ezek az elemek lépnek be a hatókörbe.
Amikor egy <Order> elemcsomópont lép be a hatókörbe, az XML Bulk Load egy rekordot generál a CustOrder táblához. Az XML Bulk Load lemásolja az OrderID attribútum értékét erre a rekordra. A CustomerID oszlop értéke a Customer> elem CustomerID gyermekeleméből< származik<.> Az XML Bulk Load a sql:relationship> által megadott információkat< használja a CustomerID idegen kulcsérték megszerzéséhez ehhez a rekordhoz, kivéve, ha a CustomerID attribútumot a <Order> elemben megadták. Az általános szabály az, hogy ha a gyermek elem kifejezetten megad egy értéket az idegen kulcs attribútumhoz, akkor az XML Bulk Load ezt az értéket használja, és nem a megadott sql:relationship> segítségével kapja meg az értéket a szülőelemtől<. Mivel ez a< Order> elemcsomópont kikerül a hatótérből, az XML Bulk Load elküldi a rekordot az SQL Servernek, majd ugyanúgy dolgozza fel az összes további <Order> elemcsomópontot.
Végül a <Ügyfél> elem csomópontja kikerül a hatókörből. Ekkor az XML Bulk Load elküldi az ügyfél rekordját az SQL Servernek. Az XML Tömeges Terhelés ezt a folyamatot követi az XML adatfolyam összes későbbi ügyféljére.
Íme két megfigyelés a leképezési sémáról:
Ha a séma megfelel a "containment" szabálynak (például az ügyfélhez és a rendeléshez kapcsolódó összes adat a hozzárendelt <ügyfél> - és <rendelési> csomópontok hatókörében van definiálva), a tömeges betöltés sikeres.
Az ügyfélelem> leírásánál< a gyermekelemeket a megfelelő sorrendben határozzák meg. Ebben az esetben a <CustomerID> gyermekelem a Order> gyermekelem előtt van megadva<. Ez azt jelenti, hogy a bemeneti XML adatfájlban a <CustomerID> elem értéke elérhető külföldi kulcsként, amikor a< Order> elem lép be a hatókörbe. A kulcsattribútumokat először megadják; ez a "Kulcssorrendi szabály".
Ha a <CustomerID> gyermekelemet a <Order> gyermekelem után megadod, az érték nem elérhető, amikor a< Order> elem lép be a hatókörbe. Amikor a </Order> végcímkét elolvassuk, a CustOrder tábla rekordja teljesnek számít, és a CustOrder táblába illesztik be egy NULL értékkel a CustomerID oszlophoz, ami nem a kívánt eredmény.
Működő mintavétel létrehozásához
A példában megadott sémát SampleSchema.xml.
Hozza létre a következő táblázatokat:
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)) GOMentse el a következő XML bemeneti mintát 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>Az XML Bulk Load végrehajtásához mentse el és hajtsa végre a következő Microsoft Visual Basic Scripting Edition (VBScript) példát (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
Kivételek a lemezgenerálási szabályból
Az XML Bulk Load nem generál rekordot egy csomópont számára, ha az IDREF vagy IDREFS típusú. Biztosítani kell, hogy a feljegyzés teljes leírása a sémán valahol található. A dt:type="nmtokens" annotációkat ugyanúgy figyelmen kívül hagyjuk, ahogy az IDREFS típust is figyelmen kívül hagyjuk.
Például vegyük az alábbi XSD sémát, amely az ügyfél>- és rendeléselemeket írja le<.>< Az <ügyfél> elem tartalmaz egy IDREFS típusú OrderList attribútumot. A< sql:relationship> címke meghatározza az ügyfél és a rendeléslista közötti egy-többhez kapcsolatot.
Ez a séma:
<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>
Mivel a Bulk Load figyelmen kívül hagyja az IDREFS típusú csomópontokat, nem történik rekordgenerálás, amikor a OrderList attribútumcsomópont lép be a hatókörbe. Ezért, ha a rendelési rekordokat szeretnéd hozzáadni a Rendelések táblázatba, azokat valahol a sémában kell leírnod. Ebben a sémában a Order> elem megadása< biztosítja, hogy az XML Bulk Load hozzáadja a rendelési rekordokat a Orders táblához. A< Order> elem leírja az összes attribútumot, amely szükséges a CustOrder tábla rekordjának kitöltéséhez.
Biztosítani kell, hogy a Customer> elemben lévő CustomerID és OrderID értékek< egyezzenek a Rendelés> elem értékeivel<. Ön felel a referencia integritás fenntartásáért.
Egy működő minta teszteléséhez
Hozza létre a következő táblázatokat:
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') GOA példában megadott leképezési sémát SampleSchema.xml.
A következő XML adat mintaadatokat SampleXMLData.xmlalatt tároljuk:
<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>Az XML Bulk Load végrehajtásához mentsük és hajtsuk végre ezt a VBScript példát (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