Как вставить несколько строк в SQL с помощью хранимых процедур? - PullRequest
4 голосов
/ 11 февраля 2012

Я могу вставить элементы в один оператор, но я хочу иметь другую версию с использованием хранимых процедур. Как я это сделал. Вот мой код:

    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;
        }
    }

Сэр / Мэм, Ваши ответы были бы очень полезны и получили бы высокую оценку. Спасибо ++

Ответы [ 2 ]

8 голосов
/ 11 февраля 2012

В 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';

Или вы можете использовать табличные параметры, как это предложил Алексей. Быстрый пример:

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

Затем создайте эквивалентный TVP в своем коде C # (я не тот парень, которому вы хотите это делать; вы можете увидеть пример здесь ).

Однако есть некоторые предостережения, пожалуйста, посмотрите на этот вопрос:

Создание обобщенного типа для использования в качестве параметра табличного значения

3 голосов
/ 11 февраля 2012

Если вы хотите передать несколько значений в хранимую процедуру, у вас есть два способа:

  • И один ужасный: передать ваши значения в виде отдельной строки, разделить ее в процедуре хранениясделать объемную вставку.Вы найдете множество примеров этого в Google.

  • Умный: используйте параметры табличных значений, функция, поддерживаемая как ADO.NET, так и SQL Server.Затем вы сможете передать значение параметра и использовать его как обычную табличную переменную в вашей хранимой процедуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...