在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本身提供。
有什么想法吗?
答案 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 */