我最近更改了我的数据库结构,现在我想从旧表Transfers
复制到我刚刚创建的新表Orders
和Orders_Transfer
):
--old table to copy from
-- table 'Transfers'
CREATE TABLE [dbo].[Transfers] (
[Id] int IDENTITY(1,1) NOT NULL,
[Date] datetime NOT NULL,
[Memo] nvarchar(max) NULL,
[Employee_Id] int NULL,
[InventoryFrom_Id] int NOT NULL,
[InventoryTo_Id] int NOT NULL,
);
-- new tables to copy to
-- table 'Orders'
CREATE TABLE [dbo].[Orders] (
[Id] int IDENTITY(1,1) NOT NULL,
[Date] datetime NOT NULL,
[Memo] nvarchar(max) NULL,
[Employee_Id] int NULL
);
-- Creating table 'Orders_Transfer'
CREATE TABLE [dbo].[Orders_Transfer] (
[Id] int NOT NULL,--foreign key on Orders.Id
[InventoryFrom_Id] int NOT NULL,
[InventoryTo_Id] int NOT NULL
);
我希望遍历旧的Transfers
表并将其中的一部分复制到Orders
(日期,备忘录,员工),其余部分复制到Orders_Transfer
(InventoryFrom_Id,InventoryTo_Id)。 Id
中的Orders_Transfer
列也是Orders.Id
上的FK,因此我也希望复制自动生成的值。
我读到了scope_identity()
函数和OUTPUT
子句,但我是SQL的初学者,不能把它们放在一起。
我正在使用SQL Server 2008
我需要做什么查询?任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
我会在OldId
表上创建一个Orders
列来存储旧的主键:
ALTER TABLE [dbo].[Orders] ADD [OldId] INT;
然后复制旧数据:
INSERT INTO [dbo].[Orders]
(
[OldId],[Date],[Memo],[EmployeeID]
)
SELECT [Id] AS [OldId],[Date],[Memo],[EmployeeID]
FROM [dbo].[Transfers];
使用OldId复制剩余数据:
INSERT INTO [dbo].[Orders_Transfer]
(
[Id],
[InventoryFrom_Id],
[InventoryTo_Id]
)
SELECT
O.Id, T.[InventoryFrom_Id], T.[InventoryTo_Id]
FROM [dbo].[Orders] O
INNER JOIN [dbo].[Transfers] T
ON O.[OldId] = T.[Id];
然后删除OldId
列:
ALTER TABLE [dbo].[Orders] DROP COLUMN [OldId];
答案 1 :(得分:0)
要使Id值保持同步,您需要使用IDENTITY_INSERT。
SET IDENTITY_INSERT dbo.Orders ON;
/* Insert data into the Orders table */
INSERT INTO [dbo].[Orders]
([Id]
,[Date]
,[Memo]
,[Employee_Id])
SELECT Id
, Date
, Memo
, Employee_Id
FROM Transfers;
SET IDENTITY_INSERT dbo.Orders OFF;
/* Insert data into the Orders_Transfer table */
INSERT INTO [dbo].[Ordres_Transfer]
([Id]
,[InventoryFrom_ID]
,[InventoryTo_ID]
SELECT Id
, InventoryFrom_ID
, InentoryTo_ID
FROM Transfers;
答案 2 :(得分:0)
Insert into newtable select * from oldtable //if same schema
insert into newtable(col1,col2,col3) select col1,col2,col3 from old table // for different table schema