2016-03-24 5 views
0

I XML-Daten, die ich in eine SQL-TabelleXML-Daten und SQL Bulk Copy

<data> 
    <racedata> 
     <race>1</race> 
     <todays_cls>97</todays_cls> 
    </racedata> 
    <stats_data> 
     <stat type="ALL_WEATHR"> 
     <starts>0</starts> 
     <wins>0</wins> 
     <places>0</places> 
     <shows>0</shows> 
     <earnings>0.00</earnings> 
     <paid>0.00</paid> 
     <roi /> 
     </stat> 
     <stat type="AT_DST_CRS"> 
     <starts>13</starts> 
     <wins>4</wins> 
     <places>1</places> 
     <shows>0</shows> 
     <earnings>93448.00</earnings> 
     <paid>12.00</paid> 
     <roi>23</roi> 
     </stat> 
    </stats_data> 
    </data> 

Die racedata Einsätze Fein SqlBulkCopy bin mit Einfügen. Als Beispiel:

bc.DestinationTableName = "racedata"; 
bc.ColumnMappings.Add("race", "race"); 
bc.ColumnMappings.Add("todays_cls", "todays_cls"); 

Das Problem ist, wenn ich versuche, die stats_data einzufügen. Wenn ich versuche, die verschiedenen Stat-Kategorien wie ALL_WEATHR und AT_DST_CRS zu erfassen, erhalte ich eine Fehlermeldung, weil die Datenquelle und die Zieltabellenspalten denselben Namen haben müssen. ALL_WEATHR und AT_DST_CRS sind jedoch keine Spaltennamen, sie sind Werte. Sie erzählen, wie sich auf jeder Art von Oberfläche Gewinne, Orte, Shows usw. ergeben können. Wie würde ich sie in eine SQL-Tabelle einfügen?

+0

beginnen Sie mit einem Diagramm Sie Datenbank zu machen. Jedes Objekt in SQL ist Teil einer Tabelle. Einige Tabellen werden zwei Spalten mit einem Namen wie ALL_WEATHR und einem Wert wie 0 und dann eine andere Zeile mit einem Namen AT_DST_CRS und einem Wert 13 sein. Andere Tabellen werden 5 oder 6 Spalten haben, wobei alle Zeilen die haben gleiche Daten in jeder Spalte. – jdweng

+0

Bitte erklären Sie etwas mehr. Warum sollte ich diese zwei Einträge als Spalten haben, wenn sie Werte sind? Die Daten würden keinen Sinn ergeben. –

+0

Häufig existieren zwei Spaltentabellen, wobei on ein Name und der andere ein Wert ist. Wir verwenden häufig Tabellen wie diese, um die ID-Nummer und den mit der ID verknüpften Namen zu enthalten. Dann haben wir andere Tabellen, die die ID-Nummer verwenden. In anderen Fällen haben wir die gleiche Datenbank auf mehreren Servern und die beiden Spaltentabellen hätten den ServerName = SERVER123, das StartDate = 1/1/16, das EndDate = 1/15/16. – jdweng

Antwort

1

Ich denke, die einfachste war die XML-Daten in einer SQL Server gespeicherte Prozedur zu übergeben und zerkleinern es dort mit diesem:

DECLARE @xml XML= 
'<data> 
    <racedata> 
    <race>1</race> 
    <todays_cls>97</todays_cls> 
    </racedata> 
    <stats_data> 
    <stat type="ALL_WEATHR"> 
     <starts>0</starts> 
     <wins>0</wins> 
     <places>0</places> 
     <shows>0</shows> 
     <earnings>0.00</earnings> 
     <paid>0.00</paid> 
     <roi /> 
    </stat> 
    <stat type="AT_DST_CRS"> 
     <starts>13</starts> 
     <wins>4</wins> 
     <places>1</places> 
     <shows>0</shows> 
     <earnings>93448.00</earnings> 
     <paid>12.00</paid> 
     <roi>23</roi> 
    </stat> 
    </stats_data> 
</data>'; 

SELECT RD.value('race[1]','int') AS Race_ID 
     ,RD.value('todays_cls[1]','int') AS Race_todays_cls  
     ,ST.value('@type','varchar(max)') AS Stat_type 
     ,ST.value('(./starts)[1]','int') AS Stat_starts 
     ,ST.value('(./wins)[1]','int') AS Stat_wins 
     ,ST.value('(./places)[1]','int') AS Stat_places 
     ,ST.value('(./shows)[1]','int') AS Stat_shows 
     ,ST.value('(./earnings)[1]','decimal(10,2)') AS Stat_earnings 
     ,ST.value('(./paid)[1]','decimal(10,2)') AS Stat_paid 
     ,ST.value('(./roi)[1]','int') AS Stat_roi 
FROM @xml.nodes('data') AS A(DT) 
CROSS APPLY DT.nodes('racedata') AS B(RD) 
CROSS APPLY DT.nodes('stats_data/stat') AS C(ST) 

Innerhalb der SP ist es einfach, die Werte von tabellenartigen Daten in einer speichern - oder besser: in vielen verwandten - Tabelle (n)

Das Ergebnis

+---------+-----------------+------------+-------------+-----------+-------------+------------+---------------+-----------+----------+ 
| Race_ID | Race_todays_cls | Stat_type | Stat_starts | Stat_wins | Stat_places | Stat_shows | Stat_earnings | Stat_paid | Stat_roi | 
+---------+-----------------+------------+-------------+-----------+-------------+------------+---------------+-----------+----------+ 
| 1  | 97    | ALL_WEATHR | 0   | 0   | 0   | 0   | 0.00   | 0.00  | 0  | 
+---------+-----------------+------------+-------------+-----------+-------------+------------+---------------+-----------+----------+ 
| 1  | 97    | AT_DST_CRS | 13   | 4   | 1   | 0   | 93448.00  | 12.00  | 23  | 
+---------+-----------------+------------+-------------+-----------+-------------+------------+---------------+-----------+----------+