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

Posted

技术标签:

【中文标题】如何使用存储过程在 SQL 中插入多行?【英文标题】:How to insert a multiple rows in SQL using stored procedures? 【发布时间】:2012-02-11 12:41:57 【问题描述】:

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

    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 注入、企业库数据块(如果您愿意,可以帮助您处理数据访问层的库)进行大量研究,然后我认为您可以做对。我可以回答你的问题,但我更愿意真正帮助你告诉你要学习的东西。 附带说明:您应该为您的 SQL 插入使用 参数化查询 - 您不应该只是将您的 SQL 语句连接在一起 - 这为 SQL 注入攻击打开了大门. See how to do parametrized queries here 【参考方案1】:

在 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

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

Split value pairs and a create table using 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(我不是您想要这样做的人;您可以看到 example here)。

不过有一些注意事项,请看这个问题:

Creating a generalized type for use as a table value parameter

【讨论】:

【参考方案2】:

如果你想将多个值传递给一个存储过程,你有两种方法:

还有一个丑陋的:将您的值作为单独的字符串传递,在您的存储过程中将其拆分,然后进行批量插入。您会在 Google 中找到大量相关示例。

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

【讨论】:

你有表值参数的例子吗?谢谢。

以上是关于如何使用存储过程在 SQL 中插入多行?的主要内容,如果未能解决你的问题,请参考以下文章

使用存储过程(SQL + C#)将数据插入一个表,然后将多行插入另一个表

MySQL存储过程从列表中插入多行

使用 T-SQL 中的一个参数将多个值插入多行

如何使用 SQL 使用 DB2 中的存储过程插入表?

如何创建 SQL 存储过程以插入多个值

如何在sql创建一条插入数据的存储过程