2016-01-04 22 views
1

我有一个巨大的XML文件,大约60 GB。我设法创建了一个带有StringBuilder的XML阅读器,在那里我可以提取我需要的特定元素。这很好。我还将我的应用程序连接到Lan Microsoft SQL服务器。批量插入到SQL与StringBuilder(VB.net)

如何使用批量插入来插入我所有最有效的行。我有大约8,400,000行,我需要插入尽可能最快的方式。

我的StringBuilder建立这样的字符串:

“FirstVariable,SecondVariable,ThirdVariable; FirstVariable,SecondVariable,ThirdVariable; FirstVariable,SecondVariable,ThirdVariable;”

我需要导入这就像一个CSV与批量插入文件:请帮

+0

嗨托比亚斯,因为你是新来的,请允许我一个提示:请注意这样一个事实,即所有专业人士给予解答所以对于声望点都很渴望。请阅读[this:someone-answers](http://stackoverflow.com/help/someone-answers)。谢谢! – Shnugo

+1

我看到你只是在......这个问题仍然是开放的吗?你需要进一步的帮助吗? – Shnugo

回答

0

尝试使用SqlBulkCopy的从CSV

+0

你可以举一个例子,用sqlbulkcopy和datatabel或stringbuilder – TobiasKnudsen

3

批量插入记录,如果我理解正确,你将您巨大的XML转换为CSV -文件。

有了这个语法,你可以一气呵成插入一个CSV文件:

CREATE TABLE testTable(int1 INT,int2 INT, int3 INT); 

--Assuming a file with the following content: 1, 2, 3; 4, 5, 6; 7, 8, 9; 
BULK INSERT testTable FROM 'F:\testCSV.txt' WITH (FIELDTERMINATOR=',', ROWTERMINATOR=';'); 

SELECT * FROM testTable; 

/* 
Result 
int1 int2 int3 
1  2  3 
4  5  6 
7  8  9 
*/ 

DROP TABLE testTable; 

你可能会尽量避免CSV转换和直接进口这一点,但是这可能会试图加载XML中的一个件,60GB非常多......

CREATE TABLE testTable(int1 INT,int2 INT, int3 INT); 

/* 
Assuiming a file with the following content: 
<data> 
    <row> 
     <a>1</a> 
     <b>2</b> 
     <c>3</c> 
    </row> 
    <row> 
     <a>4</a> 
     <b>5</b> 
     <c>6</c> 
    </row> 
    <row> 
     <a>7</a> 
     <b>8</b> 
     <c>9</c> 
    </row> 
</data> 
*/ 

INSERT INTO testTable 
SELECT RowData.value('a[1]','int') 
     ,RowData.value('b[1]','int') 
     ,RowData.value('c[1]','int') 
FROM 
(
    SELECT CAST(x.y AS XML) AS XmlData 
    FROM OPENROWSET(BULK 'F:\testXML.xml',SINGLE_CLOB) AS x(y) 
) AS XmlData 
CROSS APPLY XmlData.nodes('/data/row') AS x(RowData) 

SELECT * FROM testTable; 

/* 
Result 
int1 int2 int3 
1  2  3 
4  5  6 
7  8  9 
*/ 

DROP TABLE testTable; 

最后但并非最不重要,你会发现解释了如何使用这里明确指定格式的文件,直接使用BULK INSERT对XML文件:https://msdn.microsoft.com/en-us/library/ms191184.aspx

1

我终于明白了。我在while循环之前创建了一个datatable,然后在提取数据时将每个元素添加到数据表中。然后我在while循环中创建了一个计数器,它将每5000个元素连接到数据库,然后批量插入它们并在此之后清空数据表。这使得只能使用几MB的内存,我能够运行整个60 GB的文件,并在大约12分钟内将所有8,400,000个元素解析到我的数据库。我使用的批量插入代码是非常标准的,这里是我的解决方案的一部分:

Using bulkCopy As SqlBulkCopy = 
      New SqlBulkCopy("Server=testserver;Database=test1;User=test1;Pwd=12345;") 
       bulkCopy.DestinationTableName = "dbo.testtable" 
       bulkCopy.BatchSize = 5000 
       Try 
        ' Write from the source to the destination. 
        bulkCopy.WriteToServer(table) 

       Catch ex As Exception 
        MsgBox(ex.Message) 
       End Try 
      End Using 
+0

我很高兴你找到你的解决方案,但请允许我一个提示:请阅读[this:someone-answers](http://stackoverflow.com/help/someone -answers)。您应该接受自己的答案,将此问题标记为已关闭,并且您应该对所有有帮助的答案进行投票(以及愚蠢的回答),以便为参与者付出声望点。请看看你的其他问题。 – Shnugo