拆分并将字符串插入数据库

时间:2013-05-03 13:16:42

标签: c# vb.net sql-server-2008 insert

我确信答案就在我面前,但我似乎无法找到一个好办法。

我有一个包含很多值的字符串,所有值都由,分隔。我从来不知道(在运行之前)该字符串中将包含多少个值。我想将它们插入数据库(在本例中为SQL Server 2008),但是字符串对于NVARCHAR(MAX)来说可能太大了所以我创建了一个临时表并希望在其中插入值。

我可以很容易地做这样的事情(我会为这个例子做一个小事):

VB

myString = "101,102,103,104,105,106,107,108,109"

For Each value As String in myString.Split(",") 
    myCommand.CommandText = "INSERT INTO tempTable VALUES @value"
    myCommand.Parameters.AddWithValue("@value", value) 
Next

C#

myString = "101,102,103,104,105,106,107,108,109";

foreach (string value in myString.Split(','))
{
    myCommand.CommandText = "INSERT INTO tempTable VALUES @value";
    myCommand.Parameters.AddWithValue("@value", value);
} 

但让我们面对现实,这是的方式。如果我有8000条记录,那将导致8000个不同的插入,即使考虑这样做,我也可能会被解雇。

有人能指出我正确的方向吗?

TL;博士

带有值的字符串看起来像这样“001,002,003,004,005 ... 8000”如何插入由,分隔的每个值,而不会生成8000 INSERT个语句。

4 个答案:

答案 0 :(得分:2)

像@pondlife建议您可以将字符串保存到文本文件中,然后使用批量插入将数据插入表格中:

BULK
INSERT YourTable
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO

查看更多信息here

答案 1 :(得分:0)

您可以构建更大的Insert语句,如here所示。

INSERT INTO tempTable (ColumnName) VALUES
    (@value1), (@value2)

答案 2 :(得分:0)

您可以拆分字符串,然后将其元素连接到几个较小的组中,然后插入。

(我在没有测试的情况下编写它)

var step = 1000; /* other value ? */
var parts = str.Split(",");

for (int i = 0; i < parts.length; i += step) {
    var vals = String.Join(",",
        Enumerable.Range(i, Math.Min(step, parts.length - i)).Select(i => String.Format("({0})", parts[i])).ToArray()
    );

    ... INSERT ... vals
}

它应该导致一组这样的陈述:

INSERT MySchema.MyTable VALUES (1),(2),(3),...
INSERT MySchema.MyTable VALUES (1001),(1002),(1003),...
INSERT MySchema.MyTable VALUES (2001),(2002)

答案 3 :(得分:0)

如果您正在从数据库读取值到应用程序,那么您应该这样做。

myString = "101,102,103,104,105,106,107,108,109";

myCommand.CommandText = String.Format(@"INSERT INTO tempTable 
                          SELECT Id from Guides Where Id in ({0})",myString);

这是一次性插入多个值的快速而恰当的方法。

相关问题