[英]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.