在SQL中获取相应的自动生成的ID以匹配XML传递的值

时间:2013-08-26 06:29:05

标签: sql sql-server xml tsql

我是SQL和XML的新手,所以请耐心等待。我有一个查询,将值输入到多行文本框中,将它们作为xml传递给声明的@data xml参数,然后分别将它们写入History和Diary表。与声明的其他参数一起。

所以,我的问题是,它首先被写入日记表,其中该表中的ID是自动生成的,分别为551和552以下事项,然后将信息插入到历史表中。这不应该发生。

我希望首先将信息写入历史记录表,然后将历史记录中各个事项的“自动生成”ID作为外键传递到日记表并插入到列(DY_H_ID)中。目前,该列未填充数据,因为它仅在稍后添加。

请参阅下面的代码:

        declare @U_ID varchar(50) 
        declare @Add_U_ID varchar(50)
        declare @Subject varchar(50)
        Declare @iPriority int
        declare @data xml
        declare @UN varchar(500)
        declare @Date varchar(50)
        declare @sDesc varchar(500)

        set @U_ID = 18185
        set @Add_U_ID = 18185 --'liihvcvbbbr43v55vx4wsk2x'
        set @Subject = 'Bulk'
        set @iPriority = 2
        set @data = '<Matters>
                        <string>G0000010</string>
                        <string>G0000011</string>
                    </Matters>'
        set @Date = '2013/08/23 17:00'
        set @sDesc = 'Diary item added for : 2013/08/23 17:00 <br/>User : Tommy de Longe <br/> Bulk PAM'

        select @UN = RTRIM(LTRIM(isNull(U_Name,'') + ' ' +  isNull(U_Surname,''))) from Users with(nolock) where id = @U_ID 
        ;with cte_Tmp ([MatterIDX], [MatterID]) as 
        ( 
        select null, ParamValues.M_ID.value('.','VARCHAR(50)') 
        from @data.nodes('/Matters/string') as ParamValues(M_ID) 
        ) 
        select Matter.M_IDX as M_IDX, [MatterID] as M_ID
        into #TBL_Matter 
        from cte_Tmp 
        inner join Matter with(nolock) on cte_Tmp.[MatterID] = Matter.ID 

        Insert Into Dairy(DY_IDX,DY_MatterNo,DY_UserID,DY_Date,DY_Subject,DY_Priority) 
        select #TBL_Matter.M_IDX, #TBL_Matter.M_ID, @U_ID, @Date, @Subject, @iPriority
        from #TBL_Matter

        Insert into History(H_IDX, H_MID,H_UserID,H_Description,H_HA_ID,H_HSA_ID) 
        select #TBL_Matter.M_IDX, #TBL_Matter.M_ID, @Add_U_ID, Replace(Replace(Replace(@sDesc,'@UN', @UN),'@Date', @Date),'@Subject', @Subject), 7,19 
        from #TBL_Matter

        drop table #TBL_Matter

我收到了这段代码以维持并且让我失望。我知道我需要在查询底部切换两个插入,首先插入到History表中,然后在这种情况下获取相应的自动生成ID(事项G0000010,问题G0000011)然后将这些值插入Diary表中。有时用户可以在文本框中输入20个值,有时只能输入2个,因此它必须是动态的。

对此有任何帮助将不胜感激。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

感谢@bummi。我使用OUTPUT来获取History表中的插入ID。然后将ID和标识符H_MID放入名为@MyTableVar的表变量中。然后在日记表的INSERT上,我加入了标识符上的表变量。然后我只需将表变量ID列添加到日记表的插入列表中。像梦一样工作!非常感谢@bummi。以下是我的代码:

        declare @U_ID varchar(50) 
        declare @Add_U_ID varchar(50)
        declare @Subject varchar(50)
        declare @iPriority int
        declare @data xml
        declare @UN varchar(500)
        declare @Date varchar(50)
        declare @sDesc varchar(500)

        declare @MyTableVar table
        (
            ID int NOT NULL,
            H_MID varchar(50)
        );

        set @U_ID = 18185
        set @Add_U_ID = 18185
        set @Subject = 'Bulk'
        set @iPriority = 2
        set @data = '<Matters>
                        <string>G0000010</string>
                        <string>G0000011</string>
                    </Matters>'
        set @Date = '2013/08/23 17:00'
        set @sDesc = 'Diary item added for : 2013/08/23 17:00 <br/>User : Tommy de Longe <br/> Bulk PAM'

        select @UN = RTRIM(LTRIM(isNull(U_Name,'') + ' ' +  isNull(U_Surname,''))) from Users with(nolock) where id = @U_ID;

        with cte_Tmp ([MatterIDX], [MatterID]) --Column names for Temporary table
        as 
        ( 
            select null, ParamValues.M_ID.value('.','VARCHAR(50)') 
            from @data.nodes('/Matters/string') as ParamValues(M_ID) 
        ) 
        select Matter.M_IDX as M_IDX, [MatterID] as M_ID
        into #TBL_Matter 
        from cte_Tmp 
        inner join Matter with(nolock) on cte_Tmp.[MatterID] = Matter.ID

        Insert into History(H_IDX, H_MID,H_UserID,H_Description,H_HA_ID,H_HSA_ID)
        OUTPUT inserted.ID, inserted.H_MID INTO @MyTableVar(ID, H_MID)
        select #TBL_Matter.M_IDX, #TBL_Matter.M_ID, @Add_U_ID, Replace(Replace(Replace(@sDesc,'@UN', @UN),'@Date', @Date),'@Subject', @Subject), 7,19 
        from #TBL_Matter

        Insert Into Dairy(DY_IDX,DY_MatterNo,DY_UserID,DY_Date,DY_Subject,DY_Priority,DY_H_ID) 
        select #TBL_Matter.M_IDX, #TBL_Matter.M_ID, @U_ID, @Date, @Subject, @iPriority, mtv.ID
        from #TBL_Matter
        inner join @MyTableVar as mtv on #TBL_Matter.M_ID = mtv.H_MID

        drop table #TBL_Matter