Như Martin đã đề xuất, bạn cần bật IDENTITY_INSERT
để bạn có thể nâng cao giá trị bản sắc của riêng mình. Bạn cũng có thể cần phải có một khóa bảng để đảm bảo rằng Max (Id) trả về giá trị chính xác.
If object_id('tempdb..#TestData') is not null
Drop Table #TestData
GO
Create Table #TestData
(
Id int not null identity(1,1) Primary Key
, ParentId int not null
, Name varchar(50) not null
)
GO
Set Identity_Insert #TestData On
GO
Insert #TestData( Id, ParentId, Name )
Values( 1,0,'Food' )
, ( 2,1,'Taste' )
, ( 3,1,'Price' )
, ( 4,2,'Taste Requirement' );
With Data As
(
Select Cast(MaxId.Id + 1 As int) As Id
, T.ParentId
, 'Copy Of ' + T.name As Name
, T.Id As OldId
, 0 As OldParentId
From #TestData As T
Cross Join( Select Max( id ) As Id From #TestData ) As MaxId
Where T.Name = 'Food'
Union All
Select Cast(Parent.id + Row_Number() Over( Order By Child.Id ) + 1 As int)
, Parent.Id
, 'Copy of ' + Child.Name
, Child.Id
, Child.ParentId
From Data As Parent
Join #TestData As Child
On Child.ParentId = Parent.OldId
)
Insert #TestData( Id, ParentId, Name )
Select Id, ParentId, Name
From Data
GO
Set Identity_Insert #TestData Off
GO
Kết quả
id | parentid | name -- | -------- | ----------------- 1 | 0 | Food 2 | 1 | Taste 3 | 1 | Price 4 | 2 | Taste Requirement 5 | 0 | Copy Of Food 7 | 5 | Copy of Taste 8 | 5 | Copy of Price 9 | 7 | Copy of Taste Requirement