如何一次插入可变数量的记录?

时间:2011-03-18 18:13:02

标签: asp.net sql sql-server

我需要运行可变数量的insert语句。是否最好通过一个循环并一次执行一个查询?或者,有没有办法一次性发送所有插入?

5 个答案:

答案 0 :(得分:3)

第二个,所有插入一次性:

INSERT INTO ...
;
INSERT INTO ...
;

答案 1 :(得分:2)

这是一个用于旧版SQL Server的选项,包括2000/2005:

insert into table(col1,col2)
select 'a',1
union all
select 'b',2
union all
select 'c',3;

使用SQL Server 2008,您还可以在VALUES子句中使用多行:

insert into #temp (col1, col2)
values  ('a',1), ('b',2), ('c',3);

您还可以使用此技术从一台服务器构建脚本以在另一台服务器上运行...

考虑以下内容......

create table #temp 
(col1 char(1), col2 smallint)

insert into #temp (col1, col2)
values  ('a',1), ('b',2), ('c',3);

select 'insert into #temp (col1, col2)' as [--sqlcmd]
union all
select 'select '+quotename(col1)+' as col1, '
  +cast(col2 as varchar(10))+' as col2 union all '
from #temp

如果输出到文本并将最后一个“union all”替换为“;”您已经准备好在第二台服务器上运行查询了。

答案 2 :(得分:1)

使用事务并批量处理所有插入。不确定你正在尝试执行此操作的条件,但如果它是执行SQL语句的代码,只需打开连接,启动事务,执行所有操作,然后提交事务或在有异常时将其回滚。 / p>

编辑某些伪代码:

SqlConnection cn = new SqlConnection("my connection string");
SqlTransaction txn = cn.BeginTransaction();

SqlCommand cmd = new SqlCommand("INSERT INTO MyTable (Field1) VALUES (@Value1)");
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@Value1", SqlDbType.Whatever);

cmd.Connection = cn;
cmd.Transaction = txn;

foreach (var value1 in ListOfValues) {
  cmd.Parameters["@Value1"].Value = value1;
  int result = cmd.ExecuteNonQuery();
}

txn.Commit();
cn.Close();

当然,如果出现异常,您需要将其封装在try / catch块中并回滚事务。但这基本上就是它。

答案 3 :(得分:1)

如果您只需要行,我会一次完成所有操作:

DECLARE @Table table (RowID int identity(1,1), OtherValue int, String varchar(20))

--for a given number range, generate all numbers including and between that range
DECLARE @StartNumber int
       ,@EndNumber   int
SELECT @StartNumber=8
      ,@EndNumber=17

;WITH AllNumbers AS
(
    SELECT @StartNumber AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<@EndNumber
)
INSERT into @Table (OtherValue, String)
SELECT Number,'wow!' FROM AllNumbers
--OPTION (MAXRECURSION 500)

select * from @Table


RowID       OtherValue  String
----------- ----------- --------------------
1           8           wow!
2           9           wow!
3           10          wow!
4           11          wow!
5           12          wow!
6           13          wow!
7           14          wow!
8           15          wow!
9           16          wow!
10          17          wow!

(10 row(s) affected)

如果你有每行的实际数据不同,那么你可以做的最好是一堆插入。

根据插入数据的来源(用户输入),您需要对值进行参数化以防止注入。这将使许多INSERT在一个字符串中连接起来,并且它们之间的“:”很难和不完全不安全。在这种情况下,调用参数化插入查询的内部数组上的循环将是最安全的方式。如果您的数据不是来自用户输入,您只需从长字符串执行查询,如:

'INSERT table (col1, col2) VALUES (1,2);INSERT table (col1, col2) VALUES (3,4);INSERT table (col1, col2) VALUES (5,6);'

答案 4 :(得分:0)

您可以从SQL Server / Stored Proc框中思考并使用Entity Framework并让它为您完成所有工作。它确实缩短了开发时间。