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

Ran*_*rez 4 c# stored-procedures sql-server-2008

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

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*and 8

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

INSERT dbo.table(col1, col2) VALUES
    (1, 2),
    (2, 3),
    (3, 4);
Run Code Online (Sandbox Code Playgroud)

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

INSERT dbo.table(col1, col2)
 SELECT 1, 2
  UNION ALL SELECT 2, 3
  UNION ALL SELECT 3, 4;
Run Code Online (Sandbox Code Playgroud)

当然,您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);
Run Code Online (Sandbox Code Playgroud)

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

1,2;2,3;3,4
Run Code Online (Sandbox Code Playgroud)

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

使用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
Run Code Online (Sandbox Code Playgroud)

你可以使用C#相当于:

EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
Run Code Online (Sandbox Code Playgroud)

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

CREATE TYPE OrderLineItem AS TABLE
(
  Product INT,
  Quantity INT
);
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ale*_*aga 5

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

  • 丑陋的一个:将您的值作为单独的字符串传递,将其拆分在存储过程中,然后进行批量插入。你会在谷歌中找到大量这样的例子。

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