Если у вас имеется иерархический документ, и вам необходимо его загрузить с сохранением родительско-дочерних связей, этот пример – для вас. В нем создается две таблицы: родительская test1 и дочерняя test2. Самое сложное при этом – написать правильную аннотированную схему.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ms="urn:schemas-microsoft-com:mapping-schema"> <xsd:element name="test-table1" ms:relation="test1"> <xsd:complexType> <xsd:sequence> <xsd:element name="test-table2" ms:relation="test2"> <xsd:annotation> <xsd:appinfo> <ms:relationship parent="test1" parent-key="test1_id" child="test2" child-key="test1_id" /> </xsd:appinfo> </xsd:annotation> <xsd:complexType> <xsd:attribute name="identifier" ms:datatype="int" ms:field="test2_id"/> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="identifier" ms:datatype="int" ms:field="test1_id"/> <xsd:attribute name="field1" ms:datatype="int" ms:field="fld1"/> </xsd:complexType> </xsd:element></xsd:schema> |
Скрипт (написан на vbs):
Dim xbcp,adoStreamSet xbcp = CreateObject("SQLXMLBulkLoad.SQLXMLBulkLoad.3.0")Set adoStream = CreateObject ("ADODB.Stream") adoStream.OpenadoStream.WriteText "<ROOT>" & _ "<test-table1 identifier='10' field1='345'>" & _ "<test-table2 identifier='1' />" & _ "</test-table1>" & _ "</ROOT>"AdoStream.Position = 0 xbcp.ConnectionString = "Provider=sqloledb.1;Data Source=server;" & _ "database=pubs;User ID=user;Password=password;" xbcp.SchemaGen = truexbcp.SGDropTables = truexbcp.Transaction = truexbcp.ErrorLogFile = "c:\error.log"xbcp.TempFilePath = "c:\temp" xbcp.Execute "xbcp_schema.xml",adoStream |
После его выполнения будут созданы следующие таблицы.
test1_id | field1 |
Таблица test1.
test1_id | test2_id |
Таблица test2.