从XML向SQL Server中的表中插入数据

3

我有以下类似的xml。我想要将其插入到一个表中,并期望插入两条记录,但实际上只插入了一条记录。

示例XML:

<xmlSubmitTime>
  <submitTime>
    <TaskDate>2016-08-29</TaskDate>
    <Project>
      <ProjectId>9</ProjectId>
      <Task>
        <TaskId>5</TaskId>
        <SubTask>
          <SubTaskId>4</SubTaskId>
          <Hours>2</Hours>
          <Comment>sample string 4</Comment>
        </SubTask>
        <SubTask>
          <SubTaskId>5</SubTaskId>
          <Hours>6</Hours>
          <Comment>sample string 4</Comment>
        </SubTask>
      </Task>
    </Project>
  </submitTime>
</xmlSubmitTime>

这是我的插入语句:

INSERT INTO Sample
    SELECT
        submitTime.value('(Project/ProjectId/text())[1]', 'int') ,
        submitTime.value('(Project/Task/TaskId/text())[1]', 'int'),
        submitTime.value('(Project/Task/SubTask/SubTaskId/text())[1]', 'int'),
        submitTime.value('(TaskDate/text())[1]', 'date'),
        submitTime.value('(Project/Task/SubTask/Hours/text())[1]', 'int'),  
        0,
        submitTime.value('(Project/Task/SubTask/Comment/text())[1]', 'varchar(20)'),    
    FROM
        @SaveTimeDate.nodes('/xmlSubmitTime/submitTime') AS TEMPTABLE(submitTime)

期望的输出是:
ProjectID  TaskId SubtaskId Hours
----------------------------------
9           5        4        2
9           5        5        6

实际输出为:

ProjectID  TaskId SubtaskId Hours
---------------------------------
 9           5        4        2

您的XML结构无效。我认为,对于每个子任务,您必须使用taskID标记。 - Paresh J
1个回答

2

您需要使用第二个.nodes()调用来处理可能存在的多个<SubTask>条目。

尝试这样做:

SELECT
    submitTime.value('(Project/ProjectId)[1]', 'int') ,
    submitTime.value('(Project/Task/TaskId)[1]', 'int'),
    subtask.value('(SubTaskId)[1]', 'int'),
    subtask.value('(Hours)[1]', 'int')
FROM
    @SaveTimeDate.nodes('/xmlSubmitTime/submitTime') AS TEMPTABLE(submitTime)
CROSS APPLY
    submitTime.nodes('Project/Task/SubTask') AS XT(subtask)

这应该返回您所需的输出。您还需要将/Project/Task/SubTask节点作为XML子片段列表获取,并从这些子节点中获取SubTaskIdHours值以获取所有信息。


1
如果您认为这个答案帮助您解决了问题,请接受此答案。这将展示您对那些花费自己的时间来帮助您的人的感激之情。 - marc_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接