Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
azure SQL Database
XML Bulk Load zpracovává vstupní data XML a připravuje záznamy pro příslušné tabulky v Microsoft SQL Serveru. Logika XML Bulk Load určuje, kdy vygenerovat nový záznam, jaké hodnoty podřízených prvků nebo atributů zkopírovat do polí záznamu a kdy je záznam kompletní a připraven k odeslání do SQL Serveru k vložení.
XML Bulk Load nenačítá všechna vstupní data XML do paměti a nevytváří kompletní sady záznamů před odesláním dat na SQL Server. Je to proto, že vstupní XML data mohou být rozsáhlý dokument a načítání celého dokumentu do paměti může být nákladné. Místo toho XML Bulk Load provádí následující:
Analyzuje mapovací schéma a připravuje potřebný plán provedení.
Aplikuje plán provedení na data ve vstupním proudu.
Toto sekvenční zpracování činí důležitým poskytovat vstupní data XML specifickým způsobem. Musíte pochopit, jak XML Bulk Load analyzuje mapovací schéma a jak probíhá proces generování záznamů. S tímto pochopením můžete poskytnout mapovací schéma pro XML Bulk Load, které přinese požadované výsledky.
XML Bulk Load zpracovává běžné anotace mapovacích schémat, včetně mapování sloupců a tabulek (specifikovaných explicitně pomocí anotací nebo implicitně přes výchozí mapování) a vztahů spojení.
Poznámka:
Předpokládá se, že znáte anotované schémata mapování XSD nebo XDR. Pro více informací o schématech viz Úvod do anotovaných XSD schémat (SQLXML 4.0) nebo Anotovaná XDR schémata (zastaralé v SQLXML 4.0).
Porozumění generování záznamů vyžaduje pochopení následujících konceptů:
Rozsah uzlu
Pravidlo generování záznamů
Podmnožina záznamů a pravidlo pořadí klíčů
Výjimky z pravidla generování záznamů
Rozsah uzlu
Uzel (prvek nebo atribut) v XML dokumentu vstupuje do rozsahu , když se s ním XML Bulk Load setká v XML vstupním datovém toku. Pro uzel prvku počáteční tag elementu přináší tento prvek do rozsahu. Pro uzel atributu jméno atributu přináší atribut do rozsahu.
Uzel opouští rozsah, když pro něj již nejsou žádná data: buď na koncovém tagu (v případě prvku), nebo na konci hodnoty atributu (v případě atributového uzlu).
Pravidlo generování záznamů
Když se uzel (prvek nebo atribut) dostane do rozsahu, existuje možnost generovat záznam z tohoto uzlu. Záznam žije, dokud je příslušný uzel v rozsahu. Když uzel opustí rozsah, XML Bulk Load považuje vygenerovaný záznam za kompletní (s daty) a odešle jej SQL Serveru k vložení.
Například zvažme následující fragment schématu XSD:
<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>
Schéma specifikuje prvek <Customer> s atributy CustomerID a CompanyName . Anotace sql:relation mapuje <prvek Customer> na tabulku Customers.
Uvažujme tento fragment XML dokumentu:
<Customer CustomerID="1" CompanyName="xyz" />
<Customer CustomerID="2" CompanyName="abc" />
...
Když je XML Bulk Load dodáván se schématem popsaným v předchozích odstavcích a XML daty jako vstupem, zpracovává uzly (prvky a atributy) ve zdrojových datech následovně:
Počáteční tag prvního <prvku zákazníka> přináší tento prvek do rozsahu. Tento uzel se mapuje na tabulku Zákazníci. Proto XML Bulk Load generuje záznam pro tabulku Zákazníci.
Ve schématu se všechny atributy elementu <Zákazník> mapují na sloupce tabulky Zákazníci. Jak tyto atributy vstupují do rozsahu, XML Bulk Load kopíruje jejich hodnoty do zákaznického záznamu, který již byl generován nadřazeným rozsahem.
Když XML Bulk Load dosáhne koncového tagu <>pro Customer element, prvek přestoupí mimo rozsah. To způsobí, že XML Bulk Load považuje záznam za kompletní a odešle jej do SQL Serveru.
XML Bulk Load následuje tento proces pro každý následující<> Customer prvek.
Důležité
V tomto modelu, protože je záznam vložen při dosažení koncového tagu (nebo je uzel mimo rozsah), musíte definovat všechna data spojená se záznamem v rámci rozsahu uzlu.
Podmnožina záznamů a pravidlo pořadí klíčů
Když specifikujete mapovací schéma využívající <sql:relationship>, termín podmnožiny označuje sadu záznamů generovaných na cizí straně vztahu. V následujícím příkladu jsou záznamy CustOrder na cizí straně, <sql:relationship>.
Například předpokládejme, že databáze obsahuje následující tabulky:
Cust (CustomerID, název společnosti, město)
CustOrder (CustomerID, OrderID)
CustomerID v tabulce CustOrder je cizí klíč, který odkazuje na primární klíč CustomerID v tabulce Cust.
Nyní zvažme XML pohled, jak je specifikován v následujícím anotovaném XSD schématu. Toto schéma používá <sql:relation> ke specifikaci vztahu mezi tabulkami Cust a CustOrder.
<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>
Ukázková XML data a kroky k vytvoření pracovního vzorku jsou uvedeny níže.
Když <>se uzel Customer elementu v XML datovém souboru dostane do rozsahu, XML Bulk Load vygeneruje záznam pro tabulku Cust. XML Bulk Load pak zkopíruje potřebné hodnoty sloupců (CustomerID, CompanyName a City) z <CustomerID,><CompanyName> a <podprvků City> , jakmile tyto prvky vstoupí do rozsahu.
Když uzel <prvku Order> vstoupí do rozsahu, XML Bulk Load vygeneruje záznam pro tabulku CustOrder. XML Bulk Load zkopíruje hodnotu atributu OrderID do tohoto záznamu. Požadovaná hodnota pro sloupec CustomerID je získána z podprvku <CustomerID> v elementu <Customer> . XML Bulk Load využívá informace specifikované v <sql:relation> k získání hodnoty cizího klíče CustomerID pro tento záznam, pokud nebyl atribut CustomerID specifikován v prvku <Order> . Obecné pravidlo je, že pokud podřízený prvek explicitně specifikuje hodnotu pro atribut cizího klíče, XML Bulk Load tuto hodnotu použije a nezíská ji z nadřazeného prvku pomocí specifikovaného< sql:relationship>. Jakmile tento <uzel Order> elementu opustí rozsah, XML Bulk Load odešle záznam do SQL Serveru a poté zpracuje všechny následující <uzly Order> elementů stejným způsobem.
Nakonec <>uzel Customer element vychází z rozsahu. V té době XML Bulk Load odesílá zákaznický záznam do SQL Serveru. XML Bulk Load následuje tento proces pro všechny následující zákazníky v XML datovém toku.
Zde jsou dvě poznámky o mapovacím schématu:
Když schéma splňuje pravidlo "containment" (například všechna data spojená se zákazníkem a objednávkou jsou definována v rámci přidružených uzlů <prvků zákazníka> a <objednávky> ), hromadné načítání uspěje.
Při popisu prvku< zákazníka> jsou jeho podprvky specifikovány ve správném pořadí. V tomto případě je podprvek <CustomerID> specifikován před podprvkem <Order> . To znamená, že ve vstupním XML datovém souboru <je hodnota elementu CustomerID> dostupná jako cizí klíčová hodnota, když prvek <Order> vstoupí do rozsahu. Klíčové atributy jsou specifikovány jako první; toto je "Pravidlo pořadí klíčů".
Pokud zadáte podprvek <CustomerID> za podprvkem <Objednávky> , tato hodnota není dostupná, když prvek <Objednávka> vstoupí do rozsahu. Když je pak přečtena koncová značka </Order> , záznam pro tabulku CustOrder je považován za kompletní a vložen do tabulky CustOrder s hodnotou NULL pro sloupec CustomerID, což není požadovaný výsledek.
Vytvoření pracovního vzorku
Uložte schéma uvedené v tomto příkladu jako SampleSchema.xml.
Vytvořte tyto tabulky:
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)) GOUložte následující ukázková XML vstupní data jako 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>Pro spuštění XML Bulk Load uložte a spusťte následující příklad 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
Výjimky z pravidla generování záznamů
XML Bulk Load negeneruje záznam pro uzel při vstupu do rozsahu, pokud je tento uzel typu IDREF nebo IDREFS. Musíte zajistit, aby se kompletní popis záznamu objevil někde ve schématu. Anotace dt:type="nmtokens" jsou ignorovány stejně jako je ignorován typ IDREFS.
Například zvažte následující schéma XSD, které popisuje <prvky zákazníka> a <objednávky> . Prvek <Zákazník> obsahuje atribut OrderList typu IDREFS. Tag <sql:relationship> specifikuje vztah jedna ku mnoha mezi zákazníkem a seznamem objednávek.
Toto je sché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>
Protože Bulk Load ignoruje uzly typu IDREFS, nedochází k generování záznamů, když uzel atributu OrderList vstoupí do rozsahu. Pokud tedy chcete přidat záznamy o objednávkách do tabulky Objednávky, musíte tyto objednávky někde ve schématu popsat. V tomto schématu specifikace prvku <Objednávka> zajišťuje, že XML Bulk Load přidá záznamy objednávek do tabulky Objednávky. Prvek <Order> popisuje všechny atributy potřebné k vyplnění záznamu tabulky CustOrder.
Musíte zajistit, aby hodnoty CustomerID a OrderID v elementu <Customer> odpovídaly hodnotám v elementu <Order> . Jste zodpovědní za udržení referenční integrity.
Pro testování pracovního vzorku
Vytvořte tyto tabulky:
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') GOUložte mapovací schéma uvedené v tomto příkladu jako SampleSchema.xml.
Uložte následující ukázková XML data jako 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>Pro spuštění XML Bulk Load uložte a spuskutte tento příklad VBScriptu (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