如何使用存储过程在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中插入多行

在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都支持的功能。然后,您将能够传递一个参数值,并将其作为存储过程中的普通表变量。