1

我是 SQL 和 XML 的新手,所以请多多包涵。我有一个查询,它获取输入到多行文本框中的值,将它们作为 xml 传递给声明的 @data xml 参数,然后分别将它们写入历史表和日记表。连同声明的其他参数。

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

我希望首先将信息写入历史记录表,然后应将历史记录中相应事项的“自动生成”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

我收到了要维护的代码,这让我很头疼。我知道我需要在查询底部切换两个插入,首先插入历史表,然后在这种情况下获取相应的自动生成的 ID(事项 G0000010,事项 G0000011)然后将这些值插入日记表. 有时用户可以在文本框中输入 20 个值,有时只能输入 2 个,所以它必须是动态的。

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

4

1 回答 1

1

感谢@bummi。我使用 OUTPUT 在 History 表中获取插入的 ID。然后将 ID 和标识符 H_MID 放入一个名为 @MyTableVar 的表变量中。然后在 Diary 表的 INSERT 上,我在标识符上加入了我的表变量。然后我只是将 Table Variable ID 列添加到 Diary 表的插入列表中。像梦一样工作!非常感谢@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
于 2013-08-26T08:38:58.673 回答