将记录从1个表填充到2个表中并检索要使用的ID

时间:2017-08-08 14:49:10

标签: tsql sql-server-2008-r2 sql-insert

我有来自 SOURCE1 表的记录,我需要将这些记录移动到两个名为 DESTINATION1 DESTINATION2

的表中

我知道如何使用INSERT INTO SELECT语句将记录从 SOURCE1 表复制到 DESTINATION1 表中,但我遇到了问题。我需要的是从 SOURCE1 复制 REMARKS 数据时,我需要将其复制到 DESTINATION2 表中,检索 REFID < / strong>并将 REFID 复制到 FK_DESTINATION2_REFID DESTINATION1 表格中的相应记录中。

标准是仅复制 SOURCE1 表中状态为1的记录,并仅将相应的 REMARKS 数据复制到 DESTINATION2 表,如果它不为空。此外,是否可以在没有存储过程的情况下执行此操作,如果不是,则没有什么大不了的。

CREATE TABLE #Source1 (
RefID int IDENTITY(1,1) NOT NULL,
Status bit NULL,
ProviderID int NULL,
Remarks varchar(max) NULL
)

Create Table #Destination1 (
RefID int IDENTITY(1,1) NOT NULL,
Status bit NULL,
ProviderID int NULL,
FK_Destination2_RefID int
)

Create Table #Destination2 (
RefID int IDENTITY(1,1) NOT NULL,
Remarks varchar(max) NULL
)

-- Insert Records into #Source1
Insert Into #Source1 values (1,100,'Test 555')
Insert Into #Source1 values (0,400,'Test 123')
Insert Into #Source1 values (1,300,NULL)
Insert Into #Source1 values (1,500,'Test 999')
Insert Into #Source1 values (1,200,NULL)

--Drop table #Source1
--Drop table #Destination1
--Drop table #Destination2

结果如下:

Source1 Table
RefID       Status ProviderID  Remarks
----------- ------ ----------- -----------
1           1      100         Test 555
2           0      400         Test 123
3           1      300         NULL
4           1      500         Test 999
5           1      200         NULL

Destination1 Table
RefID       Status ProviderID  FK_Destination2_RefID
----------- ------ ----------- ---------------------
1           1      100         1
2           1      300         NULL
3           1      500         2
4           1      200         NULL

Destination2 Table
RefID       Remarks
------      ---------
1           Test 555
2           Test 999

编辑:我的#SOURCE1 表将保留动态设置的记录数量。在这个例子中,我有5个记录。但下一次,它可能是50条记录。每次使用#SOURCE1 表时,我都会每次截断表,REFID将重新开始1.由于这是一批记录的临时保存表,我需要移动它们永久到2个目标表,如完成时所示,因此本质上它们最初看起来像#strong> SOURCE1 表。

1 个答案:

答案 0 :(得分:0)

嗯,您在#Destination表上使用IDENTITY属性。这意味着您正在尝试为它们分配新的PK,因此它将删除唯一性/ PK - &gt; FK链接到#Source表...并且由于源表已经在处理它,所以它是不必要的。因此,只需从#Destination表中删除此属性,然后按照您的怀疑进行插入。如果需要,您仍然可以在目标表上添加UNIQUE CONSTRAINT ...但如果这是它的全部用途,则永远不应该遇到非唯一性。您的FK不会是顺序的,但这是因为您要限制要插入的数据。如果您想要另一个PK IDENTITY列,请将其分开。我已将下面的内容作为示例包含在内

CREATE TABLE #Source1 (
RefID int IDENTITY(1,1) NOT NULL,
Status bit NULL,
ProviderID int NULL,
Remarks varchar(max) NULL
)

Create Table #Destination1 (
SomePK int IDENTITY(1,1),
RefID int ,
Status bit NULL,
ProviderID int NULL,
FK_Destination2_RefID int
)

Create Table #Destination2 (
SomePK int IDENTITY(1,1),
RefID int ,
Remarks varchar(max) NULL
)

-- Insert Records into #Source1
Insert Into #Source1 values (1,100,'Test 555')
Insert Into #Source1 values (0,400,'Test 123')
Insert Into #Source1 values (1,300,NULL)
Insert Into #Source1 values (1,500,'Test 999')
Insert Into #Source1 values (1,200,NULL)



insert into #Destination2
select
    RefID
    ,Remarks
from #Source1
where
    Remarks is not null and Status = 1

insert into #Destination1
select
    s.RefID
    ,s.Status
    ,s.ProviderID
    ,d.RefID
from 
#Source1 s
left join #Destination2 d on d.RefID = s.RefID
where
    s.Status = 1

select * from #Source1
select * from #Destination1
select * from #Destination2

Drop table #Source1
Drop table #Destination1
Drop table #Destination2