我确信答案就在我面前,但我似乎无法找到一个好办法。
我有一个包含很多值的字符串,所有值都由,
分隔。我从来不知道(在运行之前)该字符串中将包含多少个值。我想将它们插入数据库(在本例中为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
个语句。
答案 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);
这是一次性插入多个值的快速而恰当的方法。