将数据从一个表复制到另一个表所需的查询是什么?

时间:2013-06-10 19:10:04

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

我最近更改了我的数据库结构,现在我想从旧表Transfers复制到我刚刚创建的新表OrdersOrders_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

我需要做什么查询?任何帮助将不胜感激,谢谢!

3 个答案:

答案 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