2013-05-03 41 views
1

我确定答案就在我的脸上,但我似乎无法找到一个好办法来做到这一点。拆分并将字符串插入数据库

我有一个字符串包含很多的值全部由,分隔。我从来不知道(在运行之前)该字符串中会有多少个值。我想将它们插入到数据库中(在本例中为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语句。

+2

您是否考虑过将数字写入文本文件,然后使用bcp.exe或'BULK INSERT'导入该文件?或者直接使用SqlBulkCopy API。 – Pondlife 2013-05-03 13:25:52

+0

但是,您究竟希望**将它们存储在数据库中? – 2013-05-03 13:26:02

+0

@Pondlife我必须承认我对任何一种解决方案都不熟悉。我会看看BULK Insert谢谢! – phadaphunk 2013-05-03 13:27:21

回答

2

像@pondlife建议您可以保存您的字符串转换成文本文件,然后使用大容量插入,你可以将数据插入到你的表:

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

查看更多信息here

0

你可以建立更大的Insert陈述,如图所示here

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

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

(我把它写withouth的测试吧)

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) 
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); 

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