【问题标题】:SQL inserting data based on nested xpath基于嵌套xpath的SQL插入数据
【发布时间】:2018-01-03 15:32:27
【问题描述】:

我正在处理一个简单的插入语句。此查询插入一条核心记录,返回一个 ID,然后将一个或多个任务插入另一个表。对于这些任务中的每一项,我都需要在第三张表中执行额外的插入操作。

由于第二个插入语句发生在第三个之前,我在试图弄清楚如何设置它时遇到了一点麻烦,所以我不确定如何从每个插入中获取 identity 以传递给查询 3 .

DECLARE @requestID INT;

    -- Insert the core request details
    INSERT INTO esas.Request (Requestor, Justification, CreatedBy, DateCreated)
    SELECT @requestor,
           @justification,
           @creator,
           GETUTCDATE()

    -- Define the core request ID
    SET @requestID = SCOPE_IDENTITY();

    -- Add tasks
    INSERT INTO esas.Task
            ( RequestID ,
              ToolID ,
              QID ,
              Action
            )
     SELECT  @requestID,
             ParamValues.x1.value('tool[1]', 'INT'),
             ParamValues.x1.value('user[1]', 'VARCHAR(10)'),
             ParamValues.x1.value('action[1]', 'INT)')
     FROM @tasks.nodes('/request/task') AS ParamValues(x1);

     -- For each task, add any associated roles (stuck here)
     INSERT INTO esas.TaskRoles
                ( TaskID, 
                  RoleID, 
                  ActionID )
     VALUES  ( 0, -- TaskID - int
               0, -- RoleID - int
               0  -- ActionID - int
               )

在最后一个插入中,我需要将通过“添加任务”创建的PK/AITaskID 以及来自XML 字符串的roleIDaction 传递到另一个表。

这是我的 XML 结构:

<request>
    <task>
        <tool>123</tool>
        <user>4567</user>
        <roles>
            <role>
                <roleID>12</roleID>
                <action>1</action>
            </role>
            <role>
                <roleID>1245</roleID>
                <action>0</action>
            </role>
            <role>
                <roleID>678</roleID>
                <action>1</action>
            </role>
        </roles>
    </task>
</request>

我的困惑是因为知道INSERT INTO esas.Task 在继续之前会同时发生,所以我不确定如何将每个身份及其在 XML 结构中的相应详细信息传递给下一个插入。

【问题讨论】:

    标签: sql-server xml xpath sql-server-2012


    【解决方案1】:

    我使用 xpath 解决了这个问题,并在插入数据后加入了 tasks 表。

         -- For each task, add any associated roles
         INSERT INTO esas.TaskRoles
                    ( TaskID, 
                      RoleID, 
                      ActionID )
         SELECT  t.TaskID,
                 ParamValues.x1.value('roleID[1]', 'INT'),
                 ParamValues.x1.value('action[1]', 'INT')
         FROM esas.Task AS t
         JOIN @tasks.nodes('/request/task/roles/role') AS ParamValues(x1)
         ON t.RequestID = @requestID
         AND t.ToolID =  ParamValues.x1.value('../../tool[1]', 'INT')
         AND t.QID =  ParamValues.x1.value('../../user[1]', 'VARCHAR(10)')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多