【发布时间】:2018-09-05 05:23:41
【问题描述】:
我需要从 XML 文件向数据库表中插入行。我的 XML 格式如下:
<Main>
<Parent>
<Title>Title1</Title>
<Code>ABC123</Code>
<Name>name1</Name>
<company>test1</company>
<Children>
<Child>
<Title>t1</Title>
<ContentType>T1</ContentType>
<TimeStarted>2018-03-01T10:47:46</TimeStarted>
<TimeFinished>2018-03-01T10:48:08</TimeFinished>
</Child>
<Child>
<Title>t2</Title>
<ContentType>T1</ContentType>
<TimeStarted>2018-03-01T10:47:46</TimeStarted>
<TimeFinished>2018-03-01T10:48:08</TimeFinished>
</Child>
</Children>
</Parent>
<Parent>
<Title>Title2</Title>
<Code>def123</Code>
<Name>name2</Name>
<company>test2</company>
<Children>
<Child>
<Title>t1</Title>
<ContentType>T1</ContentType>
<TimeStarted>2018-03-01T10:47:46</TimeStarted>
<TimeFinished>2018-03-01T10:48:08</TimeFinished>
</Child>
<Child>
<Title>t2</Title>
<ContentType>T1</ContentType>
<TimeStarted>2018-03-01T10:47:46</TimeStarted>
<TimeFinished>2018-03-01T10:48:08</TimeFinished>
</Child>
</Children>
</Parent>
</Main>
我需要在 Table1 中插入父级数据(在父级标签 - Title、Code、Name、company 下),在 Table2 中插入子级数据。 Table2 对 Table1 有 foriengy 键引用。(一旦插入父记录,我们需要使用范围标识来获取它。)
这可能是非常大的 xml 文件。主要问题是我需要一个接一个地插入记录,这意味着在循环中,好像第一个 Parent 有一些问题,那么这个过程不应该被中止,但应该记录错误并继续到第二个或下一个 Parent 标签。
我尝试搜索最佳方法,但大多数建议都是不遍历 xml 并直接插入表。以下是我尝试过的一些参考资料。
TSQL Inserting records from XML string
How to get individual identity in an XML Insert?
我需要建议,特别是我的要求可以在不循环的情况下实现? 还有什么是最好的方法,比如先插入一些临时表然后处理它,或者使用 xquery 首先获取平面数据中的所有记录,然后将光标悬停在它上面?或任何其他方法
请提出建议。
【问题讨论】:
-
XML 支持高度特定于供应商 - 所以请添加标签以指定您是否使用
mysql、postgresql、sql-server、oracle或db2- 或完全不同的东西。 -
我真的希望您的 xml 不使用
<Parent1>和<Parent2>而是使用<Parent id="1">和<Parent id="2">... 与孩子一样... 您已将其标记为 @ 987654333@。这正在缩小选择范围,但仍不清楚... -
FK 是否通过给定的
<Code>构建(在这种情况下必须是唯一的)? -
对不起,我错过了您的 cmets...不是
、 等,只是 。与子元素相同...我写错了...更新了问题。谢谢。