Martin が提案したように、IDENTITY_INSERT
を有効にする必要があります。 独自の ID 値をプッシュできるようにします。 Max( Id ) が正しい値を返すようにするために、テーブル ロックを取得する必要がある場合もあります。
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
プレ>結果
id |親 ID |名前 -- | -------- | -----------------1 | 0 |フード2 | 1 |テイスト3 | 1 |価格4 | 2 |味の要件5 | 0 | Food7 のコピー | 5 | Taste8 のコピー | 5 | Price9 のコピー | 7 |味覚要件のコピー