I was back home, and was able to test it, but Erland beat me. It takes 8 seconds to load 14393 rows.
SET NOCOUNT ON; USE tempdb; GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[cbimport]( [cbprodID] [int] IDENTITY(1,1) NOT NULL, [CategoryName] [char](50) NULL, [Site] [char](50) NULL, [Id] [char](50) NULL, [PopularityRank] [char](50) NULL, [Title] [varchar](100) NULL, [Description] [varchar](5000) NULL, [HasRecurringProducts] [char](50) NULL, [Gravity] [char](25) NULL, [EarnedPerSale] [char](25) NULL, [PercentPerSale] [char](25) NULL, [TotalEarningsPerSale] [char](25) NULL, [TotalRebillAmt] [char](25) NULL, [Referred] [char](25) NULL, [Commission] [char](25) NULL, [ActivateDate] [char](25) NULL, [remarks] [text] NULL, [void] [char](1) NULL CONSTRAINT [DF_cbimport_void] DEFAULT ((1)), CONSTRAINT [PK_cbimport] PRIMARY KEY CLUSTERED ( [cbprodID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ); GO DECLARE @x xml; SET @x = ( SELECT CONVERT(xml, x, 2) FROM OPENROWSET( BULK 'c:\temp\marketplace_feed_v2\marketplace_feed_v2.xml', SINGLE_BLOB) AS T(x) ); INSERT INTO dbo.cbimport ( CategoryName, Title, Site, PopularityRank, Description, HasRecurringProducts, Gravity, EarnedPerSale, PercentPerSale, TotalEarningsPerSale, TotalRebillAmt, Referred, Commission, ActivateDate ) SELECT C.x.value('(Name/text())[1]', 'VARCHAR(100)'), a.b.value('(Title/text())[1]', 'VARCHAR(100)'), a.b.value('(Id/text())[1]', 'VARCHAR(100)'), a.b.value('(PopularityRank/text())[1]', 'VARCHAR(20)'), a.b.value('(Description/text())[1]', 'VARCHAR(max)'), a.b.value('(HasRecurringProducts/text())[1]', 'VARCHAR(5)'), a.b.value('(Gravity/text())[1]', 'VARCHAR(10)'), a.b.value('(AverageEarningsPerSale/text())[1]', 'VARCHAR(10)'), a.b.value('(PercentPerSale/text())[1]', 'VARCHAR(10)'), a.b.value('(AverageEarningsPerSale/text())[1]', 'VARCHAR(10)'), a.b.value('(TotalRebillAmt/text())[1]', 'VARCHAR(10)'), a.b.value('(Referred/text())[1]', 'VARCHAR(20)'), a.b.value('(Commission/text())[1]', 'VARCHAR(10)'), a.b.value('(ActivateDate/text())[1]', 'VARCHAR(10)') FROM @x.nodes('Catalog/Category') AS C(x) CROSS APPLY C.x.nodes('Site') AS a(b); GOEdit: Change the path I used to access the file, and thanks for the link to the real data. I agree with Erland, that is very helpful.
AMB