Bulk Import von XML in vorhandene Tabellen

Ich bin neu in XML und SQL server und versuche, eine XML-file in SQL server 2010 zu importieren. Ich habe 14 Tabellen, die ich gerne die data in. Alle 14 Tabellennamen sind im XML als Knoten aufgelistet (ich glaube) Ich habe einen Beispielcode gefunden, der mit dem einfachen Beispiel XML gearbeitet hat, aber mein XML scheint etwas komplizierter und möglicherweise nicht optimal strukturiert zu sein. leider kann ich das nicht ändern Als Grundversuch habe ich versucht, die data in nur ein Feld einer vorhandenen Tabelle einzufügen (SILVX_SN16000), aber das Message-windows zeigt "(0 Zeilen (s) betroffen). Vielen Dank im Voraus für das Betrachten dieser.

USE TEST Declare @xml XML Select @xml = CONVERT(XML,bulkcolumn,2) FROM OPENROWSET(BULK 'C:\Users\Kevin_S\Documents \SilvxInSightImport.xml',SINGLE_BLOB) AS X SET ARITHABORT ON Insert into [SILVX_SN16000] ( md_group ) Select P.value('MD_GROUP[1]','NVARCHAR(255)') AS md_group From @xml.nodes('/TableData/Row') PropertyFeed(P) 

Hier ist eine viel verkürzte (Zeilen entfernt) Version von meinem XML:

 <?xml version="1.0" ?> <SilvxInSightImport Version="1.0" Host="uslsss17" Date="14-09-14_20-40-02"> <Tables Count="14"> <Table Name="SN16000"> <TableSchema> <Column><COLUMN_NAME>PARENT_HPKEY</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> <Column><COLUMN_NAME>MD_GROUP</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> <Column><COLUMN_NAME>PKEY</COLUMN_NAME><DATA_TYPE>NUMBER</DATA_TYPE></Column> <Column><COLUMN_NAME>S_STATE</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> <Column><COLUMN_NAME>NAME</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> <Column><COLUMN_NAME>ROUTER_ID</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> <Column><COLUMN_NAME>IP_ADDR</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> </TableSchema> <TableData> <Row><MD_GROUP>100.120.25162</MD_GROUP><PARENT_HPKEY>100</PARENT_HPKEY> <PKEY>161888</PKEY><NAME>UODEDTM010</NAME><ROUTER_ID>10.41.32.129</ROUTER_ID> <IP_ADDR>10.41.32.129</IP_ADDR><S_STATE>IS-NR</S_STATE></Row> <Row><MD_GROUP>100.120.25162</MD_GROUP><PARENT_HPKEY>100</PARENT_HPKEY> <PKEY>278599</PKEY><NAME>UODEETM010</NAME><ROUTER_ID>10.41.4.129</ROUTER_ID> <IP_ADDR>10.41.4.129</IP_ADDR><S_STATE>IS-NR</S_STATE></Row> <Row><MD_GROUP>100.120.25162</MD_GROUP><PARENT_HPKEY>100</PARENT_HPKEY> <PKEY>183583</PKEY><NAME>UODEGRM010</NAME><ROUTER_ID>10.41.76.129</ROUTER_ID> <IP_ADDR>10.41.76.129</IP_ADDR><S_STATE>IS-NR</S_STATE></Row> NT_HPKEY>100</PARENT_HPKEY><PKEY>811003</PKEY><NAME>UODWTIN010</NAME> <ROUTER_ID>10.27.36.130</ROUTER_ID><IP_ADDR>10.27.36.130</IP_ADDR><S_STATE>IS-NR</S_STATE> </Row> </TableData> </Table> </Tables> </SilvxInSightImport> 

Der xPath in .nodes () muss den ganzen Pfad zu den Row Knoten angeben, damit du mit SilvxInSightImport starten und deinen path nach Row starten SilvxInSightImport .

 /SilvxInSightImport/Tables/Table/TableData/Row 

In deinem Fall hast du mehrere Tabellenknoten, eine für jeden Tisch und ich nehme an, du brauchst nur einen Tisch zu einem timepunkt. Sie können ein Prädikat auf dem Tabellennamen in dem .nodes () xPath-Ausdruck verwenden.

 /SilvxInSightImport/Tables/Table[@Name = "SN16000"]/TableData/Row 

Ihre ganze Abfrage für SN16000 sollte so etwas aussehen.

 select TXvalue('(MD_GROUP/text())[1]', 'varchar(20)') as MD_GROUP, TXvalue('(PARENT_HPKEY/text())[1]', 'int') as PARENT_HPKEY, TXvalue('(PKEY/text())[1]', 'int') as PKEY, TXvalue('(NAME/text())[1]', 'varchar(20)') as NAME, TXvalue('(ROUTER_ID/text())[1]', 'varchar(20)') as ROUTER_ID, TXvalue('(IP_ADDR/text())[1]', 'varchar(20)') as IP_ADDR, TXvalue('(S_STATE/text())[1]', 'varchar(20)') as S_STATE from @XML.nodes('/SilvxInSightImport/Tables/Table[@Name = "SN16000"]/TableData/Row') as T(X) 

Sie müssen die für jede Spalte verwendeten datatypen sortieren.

SQL-Geige