我有一个现有的SQL Server数据库,其Customers表包含列:
Customers: CustomerId (PK), A, B, C, D, E, F
最后三列代表邮寄地址;我想将这些地址列提取到一个单独的地址表中,由FK链接,并同时迁移数据。所以我最终得到了:
Customers: CustomerId (PK), A, B, C, AddressId (FK)
Addresses: AddressId (PK), D, E, F
地址最终也会被许多其他表引用,因此它需要自己独立的AddressId,数据库生成 - 它不能与Customer共享相同的Id。地址也不能包含客户的FK - 模式必须如图所示。
我对SQL不太熟悉。在SQL中创建新的Addresses表,复制数据,然后从Customers中删除冗余列没有任何困难。但我不知道如何将数据库生成的AddressId作为FK返回到Customer中。我是否需要采用某种程序方法,例如游标 - 或者有没有办法在一个声明性SQL查询中完成整个迁移?感谢。
(N.B。我希望最终能够在Code First Migrations中做到这一点。)
答案 0 :(得分:0)
我最终找到了答案。您必须使用Merge,才能将源表和目标表中的列输出到临时表中:
Declare @MyTableVar table(
CustomerId int not null,
AddressId int not null
);
Merge into dbo.Addresses
using (select CustomerId, D,E,F from dbo.Customers) as addressDetails
on 1=0
when not matched then
insert ( D,E,F) values ( Customers.D, Customers.E, Customers.F)
output addressDetails.CustomerId, inserted.AddressId into @MyTableVar;
update Customers set AddressId =
(Select AddressId from @MyTableVar where CustomerId = Customers.CustomerId );