簡體   English   中英

在SQL中獲取相應的自動生成的ID以匹配XML傳遞的值

[英]Getting corresponding auto-generated ID's in SQL to match XML passed values

我是SQL和XML的新手,所以請多多包涵。 我有一個查詢,該查詢將值輸入到多行文本框中,將它們作為xml傳遞給聲明的@data xml參數,然后分別將它們寫入History和Diary表。 連同其他參數一起聲明。

因此,我的問題是,它首先被寫入Diary表,該表中的ID是自動生成的,對於以下事項,分別說551和552,然后將信息插入到History表中。 這不應該發生。

我希望首先將信息寫入“歷史記錄”表,然后應將“ History”中各個事項的ID作為外鍵傳遞給Diary表,並插入到列(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),然后將這些值插入到Diary表中。 有時用戶可以在文本框中輸入20個值,其他時候只能輸入2個,因此它必須是動態的。

關於此的任何幫助將不勝感激。 提前致謝。

感謝@bummi。 我使用OUTPUT來獲取“歷史記錄”表上插入的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM