如何使用存储过程在SQL中插入多行
本文关键字:插入 SQL 何使用 存储过程 | 更新日期: 2023-09-27 18:24:02
我可以在一条语句中插入这些项,但我想做的是使用存储过程获得另一个版本。我该怎么做。这是我的代码:
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都支持的功能。然后,您将能够传递一个参数值,并将其作为存储过程中的普通表变量。