如何使用存储过程在SQL中插入多行?

我能够在单个语句中插入项目,但我想要做的是使用存储过程的另一个版本。 我怎么做。 这是我的代码:

private void button1_Click(object sender, EventArgs e) { #region Get Values string[] array = {textBox1.Text+":"+textBox5.Text,textBox2.Text+":"+textBox6.Text,textBox3.Text+":"+textBox7.Text,textBox4.Text+":"+textBox8.Text}; string query = ""; string product = ""; int qty = 0; for (int i = 0; i < array.Length; i++ ) { product = array[i].ToString().Substring(0,array[i].ToString().IndexOf(':')); qty = int.Parse(array[i].ToString().Substring(array[i].ToString().IndexOf(':')+1)); if (string.IsNullOrEmpty(query)) { query = "Insert Into MySampleTable Values ('"+product+"','"+qty+"')"; } else { query += ",('" + product + "','" + qty + "')"; } } #endregion string connect = "Data Source=RANDEL-PC;Initial Catalog=Randel;Integrated Security=True"; SqlConnection connection = new SqlConnection(connect); connection.Open(); string insert = query; SqlCommand command = new SqlCommand(query,connection); command.ExecuteNonQuery(); command.Dispose(); connection.Close(); connection.Dispose(); label5.Visible = true; label5.Text = insert; } } 

先生/女士,您的答案将会有很大的帮助,非常感谢。 谢谢++

在SQL Server 2008+中,有更简单的方法可以在单个语句中插入多行。 例如,此语法有效:

 INSERT dbo.table(col1, col2) VALUES (1, 2), (2, 3), (3, 4); 

以上将插入三行。 在旧版本中,您可以执行稍微冗长的操作,例如:

 INSERT dbo.table(col1, col2) SELECT 1, 2 UNION ALL SELECT 2, 3 UNION ALL SELECT 3, 4; 

当然,您的ExecuteNonQuery不必是单个命令,您可以将其作为单个字符串传递,它仍然可以工作:

 INSERT dbo.table(col1, col2) VALUES(1, 2); INSERT dbo.table(col1, col2) VALUES(2, 3); INSERT dbo.table(col1, col2) VALUES(3, 4); 

如果要在存储过程中执行此操作,可以轻松地对多值参数执行拆分,例如,如果传入以下字符串:

 1,2;2,3;3,4 

您可以使用我在此处发布的函数处理这些值:

使用UDF拆分值对和创建表

所以你的程序可能如下所示:

 CREATE PROCEDURE dbo.AddOrderLineItems @LineItems VARCHAR(MAX) AS BEGIN SET NOCOUNT ON; INSERT dbo.OrderItems(Product, Quantity) SELECT Product, Quantity FROM dbo.MultiSplit(@LineItems); END GO 

你可以使用C#相当于:

 EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4'; 

或者您可以使用Alexey建议的表值参数。 一个简单的例子:

 CREATE TYPE OrderLineItem AS TABLE ( Product INT, Quantity INT ); 

然后你可以创建一个程序:

 CREATE PROCEDURE dbo.AddOrderLineItems @LineItems OrderLineItem READONLY -- other parameters AS BEGIN SET NOCOUNT ON; INSERT dbo.OrderItems(Product, Quantity) SELECT Product, Quantity FROM @LineItems; END GO 

然后在你的C#代码中创建等效的TVP(我不是你想做的那个人;你可以在这里看到一个例子 )。

不过有一些警告,请看这个问题:

创建用作表值参数的通用类型

如果要将多个值传递到存储过程,您有两种方法:

  • 丑陋的一个:将您的值作为单独的字符串传递,在商店过程中将其拆分,进行批量插入。 你会在谷歌找到很多例子。

  • 一个聪明的方法:使用表值参数,这是ADO.NET和SQL Server支持的function。 然后,您将能够传递参数值并将其作为存储过程中的普通表变量。