使用StringBuilder批量插入SQL(VB.net)

时间:2016-01-04 23:27:53

标签: sql xml csv insert bulk

我有一个巨大的XML文件,大约60 GB。我设法用StringBuilder创建一个XML阅读器,在那里我可以提取我需要的特定元素。这非常有效。我还将我的应用程序连接到Lan Microsoft SQL服务器。

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

我的StringBuilder设置如下字符串:

" FirstVariable,SecondVariable,ThirdVariable; FirstVariable,SecondVariable,ThirdVariable; FirstVariable,SecondVariable,ThirdVariable;"

我需要将其导入为带有批量插入的CSV文件:)请帮助

3 个答案:

答案 0 :(得分: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;

最后但并非最不重要的是,您将在此处找到如何使用明确指定的格式文件直接对XML文件使用BULK INSERT的说明:https://msdn.microsoft.com/en-us/library/ms191184.aspx

答案 1 :(得分:1)

我终于明白了。我在while循环之前创建了一个数据表,然后在提取数据时将每个元素添加到数据表中。然后我在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

答案 2 :(得分:0)

尝试使用SqlBulkCopy从csv

插入批量记录