sql-server - 将数据从 XML 插入到 SQL Server 中的表中

标签 sql-server tsql

我有如下所示的 xml。我想插入一个表,我希望插入 2 条记录,但它只插入一条记录。

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

最佳答案

您需要再次调用 .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从这些子节点中获取所有信息的值

关于sql-server - 将数据从 XML 插入到 SQL Server 中的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39231639/

相关文章:

sql - 我如何设置一个sql server用户以只读模式执行存储过程

mysql - 加入来自 2 个表的查询 - 多个结果

sql-server - SQL Server 2000 MSDE 有 DTS 吗?

sql - 修复 XML 解析的技术 : illegal qualified name character

sql - 使用 Exists 1 或 Exists * 的子查询

sql-server - TSQL - Select 中的 While 循环?

php - Codeigniter - 如何连接 ORACLE、MySQL 和 SQL Server?

sql-server - 使用 HL7 消息在我的 SQL Server 中插入数据

sql-server - 如何在 SQL Server 中使 LIKE '%Search% 更快

sql - T-Sql 查询 - 获取跨 2 列的唯一行