【问题标题】:insert multiple rows with one query using a C# array使用 C# 数组通过一个查询插入多行
【发布时间】:2014-02-17 16:46:17
【问题描述】:

我有userIds的列表

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?

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

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

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

【问题讨论】:

标签: c# tsql bulkinsert sql-insert


【解决方案1】:
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);

【讨论】:

    【解决方案2】:

    我建议你看看这个帖子: 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 答案比我的要好。

    【讨论】:

      【解决方案3】:

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

       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) 
      

      【讨论】:

        【解决方案4】:

        如果您将此作为答案
        我使用 TVP 加载多达 100 万行,而且速度很快
        它基本上就像一个反向 DataReader

        当您得到一些答案时,您可以使用值 (1)、(2) 最多插入 1000 个。如果超过 1000 则可以使用 TVP。

        TVP

        如果是集合(不是 DataTable),则使用

        SqlDataRecord

        enter link description here

        【讨论】:

          猜你喜欢
          • 2018-04-26
          • 2013-11-06
          • 2015-06-28
          • 1970-01-01
          • 2021-10-04
          • 2011-12-29
          • 1970-01-01
          • 2020-09-05
          相关资源
          最近更新 更多