2014-02-17 25 views
0

一个查询插入多行我的userIds与使用C#阵列

List<int> userIds = new List<int>();

我有代码中插入它们到分贝的列表。
ExecuteSQL(sql)是我自己的函数,抽象了所有的数据库特定的逻辑

string iSql = ""; 
foreach(int id in userIds){ 

iSql = "insert into users (id) values (" + id + ")"; 
ExecuteSQL(iSql); 

} 

我想插入所有这些在一个查询,而不必调用像上面的循环, 这可能在SQL?

如果是这样,那么string iSql会是什么样子?

我发现Inserting multiple rows in a single SQL query?

但可能创造一个大的字符串。

,我发现其他文章要么其他语言或只是困惑,因为我无法它们与我的问题

(后来我才可以照顾参数的,我只需要查询)

+1

当你得到了一些答案,我认为1000使用可以插入了值(1),(2)。如果超过1000则可以使用TVP。 http://msdn.microsoft.com/en-us/library/bb510489.aspx – Paparazzi

+1

参考http://lennilobel.wordpress.com/2009/07/29/sql-server-2008-table-valued-parameters-and -C-定制迭代器-A-比赛做在天堂/ – Paparazzi

回答

3
StringBuilder sb = new StringBuilder(); 
foreach(int id in userIds){ 
    sb.AppendLine("insert into users (id) values (" + id.ToString() + ");"); 
} 
ExecuteSQL(sb.ToString()); 

你真的应该使用参数化查询。但上述将做你所需要的。

或备选地。

string iSql = string.Format("insert into users (id) values {0};", string.Join(",", userIds.Select(i => string.Format("({0})", i)))); 
ExecuteSQL(iSql); 
1

我建议你看看这个线程: How should I multiple insert multiple records?

有一个很好的方式做你想做的。

如果你仍然想使用一个字符串作为查询,你可以这样做:

string iSql = "insert into users (id) values"; 
foreach(int id in userIds){ 
iSql += "(" + id + "),"; 

} 
ExecuteSQL(iSql); 

但说实话,我不喜欢它:)

编辑: Eoldre答案用的StringBuilder比我好。

1

您可以制作一个存储过程并使用xml字符串发送插入的数据(userid)。在存储过程中,您可以使用单个插入/选择查询并在表中插入所有数据。请使用以下代码

create proc insertuser 
    @xml xml 
    as 

set @xml=N'<ids> 
<user><id>127531</id></user> 
<user><id>5445</id> </user> 
<user><id>477</id> </user> 
<user><id>785</id> </user> 
<user><id>456</id> </user> 
</ids>'          
declare @tbl table(id int) 

insert into users(id) 
select r.c.value('id[1]','int') 
from @xml.nodes('ids/user') as r(c) 
1

如果你使用它作为一个答案
我用TVP加载了100万行,这是快速
它基本上就像一个反向的DataReader

正如你得到了一些答案,你可以插入我认为1000使用值(1),(2)。如果超过1000则可以使用TVP。

TVP

如果它是一个集合(而不是数据表),然后使用

SqlDataRecord

enter link description here