当目标表具有主键时,将数据从一个表插入另一个表

时间:2014-09-16 21:49:38

标签: sql sql-server

在SQL Server中,我有一个表作为RawTable(temp),它由CVS提供,假设它有22列。然后,我需要将现有记录(只有少数列不是全部)复制到另一个表中作为访客,而不是临时表。

访客表的ID列为INT,是主键和增量。

RawData表

id  PK, int not null
VisitorDate  Varchar(10)
VisitorTime  Varchar(11)

访客表

VisitorID, PK, big int, not null
VisitorDate,  Varchar(10), null
VisitorTime   Varchar(11), null

所以我做了:

insert into [dbo].[Visitors] ( [VisitorDate], [VisitorTime])    
select [VisitorDate], [VisitorTime]
from RawTable   /*this is temp table */

似乎SQL Server不喜欢这种方法所以它抛出

Msg 515,Level 16,State 2,Line 1 无法将值NULL插入列'VisitorID',表'TS.dbo.Visitors';列不允许空值。 INSERT失败。该声明已被终止。

如何让Sql Server不要抱怨主键?你知道的这个专栏将由sql server本身提供。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

仅仅因为您的访问者表有一个ID列是主键并不意味着服务器将为您提供您的ID值。如果您希望SQL提供ID,那么您需要更改表定义并使visitorId列成为IDENTITY列。

否则,你可以在插入过程中使用ROW_NUMBER函数伪造这些id -

DECLARE @maxId INT;

SELECT @maxId = (SELECT MAX(visitorsId) FROM dbo.visitors);

INSERT INTO  [dbo].[Visitors] ( [visitorsId],[VisitorDate], [VisitorTime])    
SELECT @maxId + ROW_NUMBER() OVER (ORDER BY visitorDate), [VisitorDate], [VisitorTime]
from RawTable   /*this is temp table */