2016-10-04 2 views
1

Ich habe eine Abfrage, die gut funktioniert, um XML-Daten (normalerweise) in eine SQL-Tabelle zu bringen. Mein aktuelles Problem ist, dass ich versucht habe, diese Abfrage mit einer viel größeren XML-Datei zu verwenden, und es maximiert meine Tempdb (und Speicherplatz) und schlägt fehl. Kann jemand helfen?SQL - Große XML-Datei maximiert TEMPDB beim Importieren

;WITH XMLNAMESPACES(DEFAULT 'http://www.adc.ca/ETS/v3') 
    INSERT INTO [CC-DB].[dbo].[TourTimeLogs] ([Rig],[Job],[Date],[Sheet],[Rev],[TourID],[StartTime],[EndTime],[Mins],[Code],[Detail]) 
    SELECT 
     RIG = XC.value('(../../../../../../Rig/RigId)[1]', 'varchar(100)'), 
     JOB = XC.value('(../../../../../../JobNo)[1]', 'varchar(100)'), 
     DATE = XC.value('(../../../../Date)[1]', 'date'), 
     SHEET = XC.value('(../../../../SheetNo)[1]', 'varchar(100)'), 
     REV = XC.value('(../../../../Revision)[1]', 'varchar(100)'), 
     TOURID = XC.value('(../../@tourId)[1]', 'varchar(100)'), 
     STARTTIME = XC.value('(FromTime)[1]', 'datetime'), 
     ENDTIME = XC.value('(ToTime)[1]', 'datetime'), 
     MINS = datediff(minute, XC.value('(FromTime)[1]', 'datetime'), XC.value('(ToTime)[1]', 'datetime')), 
     TIMECODE = XC.value('(TimeCodeNo)[1]', 'varchar(100)'), 
     DETAIL = XC.value('(Detail)[1]', 'varchar(100)')  
    FROM 
     [CC-DB].[dbo].[XmlSourceTable] SRC 
    CROSS APPLY 
     SRC.XmlData.nodes('/ETS/WellTours/WellTour/DayTours/DayTour/Tours/Tour/TimeLogs/TimeLog') AS XT(XC) 
+0

Die Größe von Tempdb ist einstellbar und der Speicherort der Datendatei für Tempdb kann ebenfalls festgelegt werden. So können Sie Tempdb auf eine Festplatte mit genügend Speicherplatz verschieben. – usterdev

+0

Unser Netzwerkspeicherplatz ist begrenzt, das letzte Mal habe ich das mit einer riesigen Datei versucht - tempdb ging bis zu 20GB und die Abfrage ist fehlgeschlagen. –

+0

Wie liest man die XML-Datei in kleineren Teilen und verschiebt sie in die Datenbank? Dies kann durch eine einfache .NET-Seite erfolgen. –

Antwort

1

Ohne die tatsächlichen XML dies die magischen Glaskolben, aber ich werde es ausprobieren liest:

Ihr Anruf zu

.nodes('/ETS/WellTours/WellTour/DayTours/DayTour/Tours/Tour/TimeLogs/TimeLog') 

sagt mir, dass es ein XML mit einem Wurzelknoten ETS und ein verschachteltes 1: n-Struktur von WellTours, DayTours, Touren und TimeLogs.

Sie könnte etwa so versuchen:

;WITH XMLNAMESPACES(DEFAULT 'http://www.adc.ca/ETS/v3') 
INSERT INTO [CC-DB].[dbo].[TourTimeLogs] ([Rig],[Job],[Date],[Sheet],[Rev],[TourID],[StartTime],[EndTime],[Mins],[Code],[Detail]) 
SELECT 
    RIG = WT.value('(Rig/RigId)[1]', 'varchar(100)'), 
    JOB = WT.value('(JobNo)[1]', 'varchar(100)'), 
    [DATE] = DT.value('(Date)[1]', 'date'), 
    SHEET = DT.value('(SheetNo)[1]', 'varchar(100)'), 
    REV = DT.value('(Revision)[1]', 'varchar(100)'), 
    TOURID = T.value('@tourId', 'varchar(100)'), 
    STARTTIME = TL.value('(FromTime)[1]', 'datetime'), 
    ENDTIME = TL.value('(ToTime)[1]', 'datetime'), 
    MINS = datediff(minute, TL.value('(FromTime)[1]', 'datetime'), TL.value('(ToTime)[1]', 'datetime')), 
    TIMECODE = TL.value('(TimeCodeNo)[1]', 'varchar(100)'), 
    DETAIL = TL.value('(Detail)[1]', 'varchar(100)')  
FROM 
    [CC-DB].[dbo].[XmlSourceTable] SRC 
CROSS APPLY 
    SRC.XmlData.nodes('/ETS/WellTours/WellTour') AS A(WT) 
CROSS APPLY 
    WT.nodes('DayTours/DayTour') AS B(DT) 
CROSS APPLY 
    DT.nodes('Tours/Tour') AS C(T) 
CROSS APPLY 
    T.nodes('TimeLogs/TimeLog') AS D(TL) 

Aufmerksamkeit Wenn nichts zurückgegeben ist, mit OUTER APPLY das gleiche versuchen. Ohne einen echten XML dies zu testen, ist es ein Blindflug ...

lesen als solche:

  • Suche alle <WellTour> -Elemente
  • Suche alle <DayTour> -Elemente unter jedem <WellTour>
  • Finden Sie alle <Tour> -Elemente unter jedem <DayTour>
  • Finden Sie alle <TimeLog> -Elemente unter jedem <Tour>

Lesen Sie die Daten vom aktuellen Füllstand ab. Spring nicht rückwärts. XML ist am besten zu lesen Forward-only (wenn möglich).

+0

Hinzufügen von CROSS APPLY-Anweisungen funktionierte perfekt, nur um jeden von ihnen alle zurück auf die Wurzel zu verweisen. Hat meine Testdatei von 47 Minuten auf 12 gelöscht. Danke. –

+0

@ C-COOP, froh, das zu lesen! Was meinst du mit * musste nur alle auf die Wurzel * zurückführen? Genau das sollte ** nicht ** notwendig sein ... – Shnugo

+0

@ C-COOP Ohne dein XML zu kennen kann ich dir nicht helfen ... Aber - sicher! - Das ist falsch ... Eine Sache ist, dass Sie nicht die Verbindung zwischen einem Knoten und seinen Unterknoten behalten, die zu falschen Daten führen könnte ... Und - mit korrekten 'APPLY's sollte dies viel schneller sein. .. Wenn möglich, poste bitte ein reduziertes XML, einige Knoten davon, um die Prinzipien zu zeigen ... – Shnugo