2013-05-03 72 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); 

這是快速且適當的方式來一次插入多個值。