我有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?,
但这可能会创建一个大字符串。
我发现的其他文章要么是其他语言,要么只是令人困惑,因为我无法将它们与我的问题联系起来
(我可以稍后处理参数化,我只需要查询)
答案 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。
如果它是一个集合(不是DataTable),那么使用