Hi KhtanThankyou for your reply. I can insert the parent items first if I order the result set, but the code does still appear to insert the first parent item for all the child items. I have a small prototype that creates the tables etc, if you run this, then you can see the output and it may make a bit more sense what I am trying to achieve:Create table #Basketline( BasketID int identity primary key, PartOrderID int, ParentID int, CatalogueItemReference nvarchar(50), ParentCatalogueItemReference nvarchar(50), Quantity int, IsBundle bit, IsWarranty bit, LineItemTPNB nvarchar(20), LineItemDescription nvarchar(max), LineItemCatalogueItem nvarchar(20), LineItemQuantity int)Create table #TempBasketLine( BasketLineID int identity primary key, ParentID int, PartOrderID int, CatalogueItemreference varchar (10), ParentCatalogueItemreference varchar (10), CatalogueItem xml)-- Insert Item of quantity of 5insert into #TempBasketLine( ParentID, PartOrderID, CatalogueItemreference , ParentCatalogueItemreference, CatalogueItem )select null,107,'211-111',null,'<OrderLine CatalogueItemReference = "211-111" IsWarranty = "0" Quantity = "2" IsBundle = "1"> <LineItems> <LineItem TPNB = "122a" Description = "Table" CatalogueItemReference = "212-122" Quantity = "1"/> <LineItem TPNB = "123b" Description = "Chair" CatalogueItemReference = "213-123" Quantity = "4"/> <LineItem TPNB = "124c" Description = "Stools" CatalogueItemReference = "214-124" Quantity = "2"/> </LineItems></OrderLine>'insert into #BasketLineselect PartOrderID, null as ParentID, CatalogueItemReference, ParentCatalogueItemReference, CatalogueItem.value('(//OrderLine/@Quantity)[1]','int')as Quantity, CatalogueItem.value('(//OrderLine/@IsBundle)[1]','bit')as IsBundle, CatalogueItem.value('(//OrderLine/@IsWarranty)[1]','bit')as IsWarranty, li.value('@TPNB','varchar(10)')as LineItemTPNB, li.value('@Description','varchar(max)')as LineItemDescription, li.value('@CatalogueItemReference','varchar(10)')as LineItemCatalogueItem, li.value('@Quantity','int')as LineItemQuantityfrom #TempBasketLineCROSS APPLY CatalogueItem.nodes('//OrderLine/LineItems/LineItem')as L(li)select * from #BasketLineinsert into #BasketLine( PartOrderID, ParentID, CatalogueItemReference, ParentCatalogueItemReference, Quantity, IsBundle, IsWarranty, LineItemTPNB, LineItemDescription, LineItemCatalogueItem, LineItemQuantity)select distinct PartOrderID, null, CatalogueItemReference, ParentCatalogueItemReference, CatalogueItem.value('(//OrderLine/@Quantity)[1]','int')as Quantity, CatalogueItem.value('(//OrderLine/@IsBundle)[1]','bit')as IsBundle, CatalogueItem.value('(//OrderLine/@IsWarranty)[1]','bit')as IsWarranty, null as LineItemTPNB, null as LineItemDescription, null as LineItemCatalogueItem, 1from #TempBasketLineCROSS APPLY CatalogueItem.nodes('//OrderLine/LineItems/LineItem')as L(li)where CatalogueItem.value('(//OrderLine/@IsBundle)[1]','bit')=1declare @count intset @count = 0while @count <= (select max(quantity*LineItemQuantity) from #BasketLine)begin declare @number table (number int) insert into @number select @count set @count = @count + 1endcreate table #temp ( BasketID int identity primary key, PartOrderID int, ParentID int, CatalogueItemReference nvarchar(50), ParentCatalogueItemReference nvarchar(50), Quantity int, IsBundle bit, IsWarranty bit, LineItemTPNB nvarchar(20), LineItemDescription nvarchar(max), LineItemCatalogueItem nvarchar(20), LineItemQuantity int)insert into #temp( PartOrderID, ParentID, CatalogueItemReference, ParentCatalogueItemReference, Quantity, IsBundle, IsWarranty, LineItemTPNB, LineItemDescription, LineItemCatalogueItem, LineItemQuantity)select PartOrderID, ParentID, CatalogueItemReference, ParentCatalogueItemReference, Quantity, IsBundle, IsWarranty, LineItemTPNB, LineItemDescription, LineItemCatalogueItem, LineItemQuantityfrom #BasketLine binner join @number n on n.number < (b.quantity*LineItemQuantity)order by LineItemTPNBupdate #tempset ParentID = (select max(BasketID) from #temp p where p.LineItemTPNB is null and p.BasketID <=b.BasketID)from #temp b where LineItemTPNB is not nullselect * from #tempdrop table #BasketLinedrop table #tempdrop table #TempBasketLine Thanks again for your timeHearty head pats