【问题标题】:SQL Server : how to merge XML into several tablesSQL Server:如何将 XML 合并到多个表中
【发布时间】:2014-09-30 08:08:57
【问题描述】:

我的架构有 3 个级别,如下所示:

触发器

TRIGGER_ID (PK), TARGET_GROUP_SERIAL, EVENT_ID, START_DATE, END_DATE, MEASURE_FIELD, IS_ACTIVE, PRIORITY

触发动作

TRIGGER_ID, TRIGGER_DETAIL_ID (PK + Identity Insert), ACTION_ID, ISOLATION_VOLUME

动作频道

TRIGGER_DETAIL_ID (PK), EXECUTION_METHOD_ID

现在,我的输入是一个 XML 文件,我需要将它合并到 DB 架构中,XML 如下所示,

请注意,如果 XML 在 RealTimeTrigger 中不包含 TriggerID,则表示新触发器,当 ActionDetailId = 0 时表示新动作

有什么建议吗?

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfRealTimeTrigger xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <RealTimeTrigger>
    <TargetGroupSerial>3</TargetGroupSerial>
    <ClientTriggerId>1</ClientTriggerId>
    <StartDate>2014-08-06T00:00:00</StartDate>
    <EndDate>2014-09-03T00:00:00</EndDate>
    <MeasureField>FIELD4</MeasureField>
    <IsActive>true</IsActive>
    <Priority>999</Priority>
    <ControlGroupPercentage>20</ControlGroupPercentage>
    <Actions>
      <RealTimeAction>
        <ActionDetailId>0</ActionDetailId>
        <Id>12</Id>
        <Channels>
            <Channel>
                <ChannelId>100</ChannelId>
                <ChannelId>201</ChannelId>
            </Channel>
        </Channels>
        <ActionPrecentage>40</ActionPrecentage>
      </RealTimeAction>
      <RealTimeAction>
        <ActionDetailId>0</ActionDetailId>
        <Id>13</Id>
        <Channels>
            <Channel>
                <ChannelId>100</ChannelId>
                <ChannelId>201</ChannelId>
            </Channel>
        </Channels>
        <ActionPrecentage>40</ActionPrecentage>
      </RealTimeAction>
    </Actions>
  </RealTimeTrigger>
</ArrayOfRealTimeTrigger>'

【问题讨论】:

  • 根据标签 wiki,“scheme 是 Lisp 家族中的一种函数式编程语言,它与 lambda 演算密切相关,具有急切(应用顺序)评估。”这似乎与scheme 没有任何关系,所以我删除了标签。将标签添加到您的问题时,请务必阅读标签说明。

标签: sql sql-server xml merge


【解决方案1】:

如果没有将子元素链接在一起的 XML 的 id 值(如果只是通过嵌套在 XML 中链接),那么我将使用带有 ROWNUMBER 的选择来为 XML 中的行分配临时 id。然后我认为你可以在触发器表中使用 MERGE 到表变量中。在该表变量中,您可以为基于原始/ROWNUMBER 的 id 提供一列,并为新记录插入的 id 提供一列。然后你有足够的数据将事物连接在一起并在接下来的两个级别重复。

如果您需要更多详细信息,请告诉我,或者这足以让其他人扩展。

【讨论】:

  • @Yairt 我看到您将此标记为最佳答案。这足以解决您的问题吗?如果是这样,并且您碰巧能够针对您的问题发布完整的有效答案,我认为如果您可以将其作为答案发布在这里,那就太棒了。
猜你喜欢
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2012-03-02
  • 2020-12-13
  • 2018-01-10
相关资源
最近更新 更多