SQL - 大 XML 文件在导入时最大化 TEMPDB
SQL - Large XML file maxes out TEMPDB when importing
我有一个查询可以很好地将 XML 数据导入 SQL table(通常)。我当前的问题是,我曾尝试将此查询与一个更大的 XML 文件一起使用,但它超出了我的 tempdb(和磁盘空间)并失败了。有人可以帮忙吗?
;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)
没有实际的 XML 这是在读 魔法玻璃灯泡 ,但我会试一试:
您的来电
.nodes('/ETS/WellTours/WellTour/DayTours/DayTour/Tours/Tour/TimeLogs/TimeLog')
告诉我,有一个 XML 有一个根节点 ETS 和一个嵌套的 1:n-structure WellTours、DayTours、Tours 和 TimeLogs。
您可以尝试这样的操作:
;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)
注意如果没有任何返回,请尝试与OUTER APPLY
相同。没有真正的 XML 来测试它,这是一个 盲目飞行 ...
这样读:
- 找到所有
<WellTour>
个元素
- 找到每个
<WellTour>
下面的所有 <DayTour>
个元素
- 找到每个
<DayTour>
下面的所有 <Tour>
个元素
- 找到每个
<Tour>
下面的所有 <TimeLog>
元素
从实际关卡读取数据。不要向后跳。 XML最好阅读forward-only(如果可能的话)。
我有一个查询可以很好地将 XML 数据导入 SQL table(通常)。我当前的问题是,我曾尝试将此查询与一个更大的 XML 文件一起使用,但它超出了我的 tempdb(和磁盘空间)并失败了。有人可以帮忙吗?
;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)
没有实际的 XML 这是在读 魔法玻璃灯泡 ,但我会试一试:
您的来电
.nodes('/ETS/WellTours/WellTour/DayTours/DayTour/Tours/Tour/TimeLogs/TimeLog')
告诉我,有一个 XML 有一个根节点 ETS 和一个嵌套的 1:n-structure WellTours、DayTours、Tours 和 TimeLogs。
您可以尝试这样的操作:
;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)
注意如果没有任何返回,请尝试与OUTER APPLY
相同。没有真正的 XML 来测试它,这是一个 盲目飞行 ...
这样读:
- 找到所有
<WellTour>
个元素 - 找到每个
<WellTour>
下面的所有 - 找到每个
<DayTour>
下面的所有 - 找到每个
<Tour>
下面的所有
<DayTour>
个元素
<Tour>
个元素
<TimeLog>
元素
从实际关卡读取数据。不要向后跳。 XML最好阅读forward-only(如果可能的话)。