1

我确信答案就在我面前,但我似乎找不到一个好的方法来做到这一点。

我有一个包含很多值的字符串,所有这些值都由,. 我永远不知道(在运行时之前)该字符串中有多少个值。我想将它们插入数据库(在本例中为 SQL Server 2008),但字符串对于 a 来说可能太大了,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”我如何插入每个由分隔的值,而不进行 8000INSERT语句。

4

4 回答 4

2

就像@pondlife 建议的那样,您可以将字符串保存到文本文件中,然后使用 Bulk Insert 将数据插入表中:

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

在此处查看更多信息:

于 2013-05-03T13:37:00.477 回答
0

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

INSERT INTO tempTable (ColumnName) VALUES
    (@value1), (@value2)
于 2013-05-03T13:44:30.210 回答
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)
于 2013-05-03T13:59:23.637 回答
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);

这是一次插入多个值的快速且适当的方法。

于 2013-05-03T14:43:17.830 回答