我正在尝试将行从旧公司复制到新公司。
SET IDENTITY_INSERT [SomeDB].[dbo].[SomeTable] ON;
INSERT INTO [SomeDB].[dbo].[SomeTable]
([HRCo]
,[Code]
,[Type]
,[Description]
,[SafetyYN]
,[Notes]
,[UniqueAttchID]
,[CertPeriod]
,[KeyID]
,[PTOTypeYN]
,[PRLeaveCode])
SELECT '6',
SomeTable.Code
,SomeTable.Type
,SomeTable.Description
,SomeTable.SafetyYN
,SomeTable.Notes
,SomeTable.UniqueAttchID
,SomeTable.CertPeriod
,[KeyID]
,SomeTable.PTOTypeYN
,SomeTable.PRLeaveCode
FROM [SomeDB].[dbo].[SomeTable]
WHERE HRCo = '11'
SET IDENTITY_INSERT [SomeDB].[dbo].[SomeTable] OFF;
我得到的结果是一个错误:
无法在具有唯一索引“ biKeyID”的对象“ dbo.SomeTable”中插入重复的键行。重复的键值为(1377)。
有没有一种方法可以为该列使用增量? (这不是主键列),或者还有另一种复制多条记录的方法吗?
答案 0 :(得分:2)
您在评论中说,主键在([HRCo], [Code], [Type])
上,而IDENTITY
在KeyID
上。此信息应在问题中。重要的是要了解正在发生的事情。
您将副本的HRCo
设置为6
,因此我认为这保证了新的主键是唯一的。
对于KeyID
,IDENTITY
列将在INSERT
期间自动获取其(新的,递增的)值,因此您不应将此列包括在INSERT
中声明。 IDENTITY
就是这样做的。 IDENTITY
自动将新的顺序值分配给新的行。而且您不应该SET IDENTITY_INSERT
在这里。让IDENTITY
做它的工作。
INSERT INTO [SomeDB].[dbo].[SomeTable]
([HRCo]
,[Code]
,[Type]
,[Description]
,[SafetyYN]
,[Notes]
,[UniqueAttchID]
,[CertPeriod]
--,[KeyID]
,[PTOTypeYN]
,[PRLeaveCode])
SELECT '6',
SomeTable.Code
,SomeTable.Type
,SomeTable.Description
,SomeTable.SafetyYN
,SomeTable.Notes
,SomeTable.UniqueAttchID
,SomeTable.CertPeriod
--,[KeyID]
,SomeTable.PTOTypeYN
,SomeTable.PRLeaveCode
FROM [SomeDB].[dbo].[SomeTable]
WHERE HRCo = '11'
请注意,我从KeyID
和INSERT
语句中都删除了SELECT
列。
答案 1 :(得分:1)
如果您正在使用
SET IDENTITY_INSERT [SomeDB].[dbo].[SomeTable] ON;
您不必设置PK值。 例如,如果您的PK是KeyID,则从INSERT中删除此列。
会是这样的:
SET IDENTITY_INSERT [SomeDB].[dbo].[SomeTable] ON;
INSERT INTO [SomeDB].[dbo].[SomeTable]
([HRCo]
,[Code]
,[Type]
,[Description]
,[SafetyYN]
,[Notes]
,[UniqueAttchID]
,[CertPeriod]
,[PTOTypeYN]
,[PRLeaveCode])
SELECT '6',
SomeTable.Code
,SomeTable.Type
,SomeTable.Description
,SomeTable.SafetyYN
,SomeTable.Notes
,SomeTable.UniqueAttchID
,SomeTable.CertPeriod
,SomeTable.PTOTypeYN
,SomeTable.PRLeaveCode
FROM [SomeDB].[dbo].[SomeTable]
WHERE HRCo = '11'