使用C#数组使用一个查询插入多行

时间:2014-02-17 16:46:17

标签: c# tsql bulkinsert sql-insert

我有userIds

的列表

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

我有代码将它们插入db。
ExecuteSQL(sql)是我自己的函数,它抽象出所有db特定逻辑

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?

但这可能会创建一个大字符串。

我发现的其他文章要么是其他语言,要么只是令人困惑,因为我无法将它们与我的问题联系起来

(我可以稍后处理参数化,我只需要查询)

4 个答案:

答案 0 :(得分: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 :(得分:1)

我建议你看一下这个帖子: How should I multiple insert multiple records?

有一种很好的方法可以做你想做的事。

如果您仍想使用字符串作为查询,可以执行以下操作:

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

}
 ExecuteSQL(iSql);

但老实说,我不喜欢它。)

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

答案 2 :(得分: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) 

答案 3 :(得分:1)

如果您使用此作为答案
我使用TVP来加载多达100万行并且速度很快 它基本上像反向DataReader一样工作

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

TVP

如果它是一个集合(不是DataTable),那么使用

SqlDataRecord

enter link description here