Обновление данных с тем же первичным ключом - PullRequest
0 голосов
/ 11 марта 2011

Я читаю данные из CSV-файла и добавляю данные в базу данных. Во время вставки данных в базу данных я хочу обновить данные с тем же первичным ключом.

например.) Я использую два столбца Штрих-коды (PK) и Количество. Поэтому, когда я вставляю данные из CSV-файла, добавляется аналогичное количество штрих-кодов.

Кто-нибудь может мне помочь? Я использую C # .NET и SQL.

Спасибо, Рашабх Шах.

Ответы [ 4 ]

2 голосов
/ 11 марта 2011

проверьте ключевое слово merge . это должно делать то, о чем вы просите.

вот сохраненный процесс, который должен сделать это для вас.

CREATE PROCEDURE dbo.InsertBarcodeData
    @Barcode varchar(255),
    @Quantity int
AS 
BEGIN
    SET NOCOUNT ON;

    MERGE myTableName AS target
    USING (SELECT @Barcode, @Quantity) AS source (BarCode, Quantity)
    ON (target.Barcode= source.Barcode)
    WHEN MATCHED THEN 
        UPDATE SET Quantity = source.Quantity + target.Quantity
    WHEN NOT MATCHED THEN   
        INSERT (BarCode, Quantity)
        VALUES (source.BarCode, source.Quantity)
END;
GO
1 голос
/ 11 марта 2011
create procedure InsertOrUpdateSales
(
    @bar_code nvarchar(100),
    @quantity int
)
as
if exists (select * from sales where bar_code = @bar_code)
  update sales set quantity = quantity + @quantity where bar_code = @bar_code
else
  insert into sales ( bar_code, quantity) values ( @bar_code, @quantity )
go

И

public static void InsertOrUpdateSales(string connection, string barCode, int quantity)
{
    using(SqlConnection conn = new SqlConnection(connection))
    {
        using(SqlCommand comm = new SqlCommand("InsertOrUpdateSales", conn))
        {
             comm.CommandType = CommandType.StoredProcedure;
             comm.Paramters.AddWithValue("@bar_code", barCode);
             comm.Paramters.AddWithValue("@quantity", quantity);
             comm.ExecuteNonQuery();
         }
     }
}

В качестве альтернативы, если вы хотите использовать оператор слияния (как упомянуто @Chris Lively и @nathan gonzalez), вы можете по-настоящему придумать и сделать это так:

  1. BULK INSERT данные из CSV-файла в пустую временную таблицу.
  2. MERGE временная таблица с существующей таблицей.
  3. TRUNCATE временная таблица.

Это может дать вам лучшие результаты. (Для определенных значений «best».)

0 голосов
/ 11 марта 2011

Вы можете добавить Триггер к таблице. Когда что-либо вставляется в таблицу, вы можете запустить хранимую процедуру.

0 голосов
/ 11 марта 2011

Если вы можете предположить, что уже существует запись для всех штрих-кодов в таблице, вы можете сделать это с помощью хранимой процедуры с двумя параметрами incominig (@BarCodeID и @AdditionalQuantity)

UPDATE yourTable SET Quantity = Quantity + @AdditionalQuantity WHERE BarCode = @BarCodeID

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