从XML中将数据插入到SQL Server表中

问题描述:

我有xml,如下所示。我想插入一个表中,我希望插入2条记录,但它只插入一条记录。从XML中将数据插入到SQL Server表中

示例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 
+0

您具有无效的xml结构。我认为,对于每个子任务,您必须使用taskID标记。 –

您需要使用第二个电话.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值以获取所有信息

+0

其工作谢谢 – Dhanalakshmi

+1

@ user3791199:如果你觉得这个答案帮助你解决问题,那么请[**接受这个答案**](http://meta.*.com/q/5234/153998)。这将表明你对那些花时间帮助你的人表示感谢。 –