Как написать SQL скрипт для вставки / обновления данных в таблицу - PullRequest
0 голосов
/ 19 марта 2020

На SQL сервере У меня есть временная таблица с именем - massupdate и основная таблица с именем retaildata

Структура выглядит следующим образом.

Массовое обновление таблицы:

| retail_id     | Qty| 
| 1             | 1  | 
| 2             | 2  | 

Retaildata таблицы:

| retail_id     | Qty| 
| 1             | 1  | 
| 2             | 2  | 

retaildata также имеет больше столбцов, но эти 2 такие же, как и для temptable massupdate.

Что должно произойти, если retail_id в massupdate таблица присутствует в retaildata, затем обновите qty в retaildata таблицу с qty из massupdate таблицы. Если retail_id из massupdate не существует в таблице retaildata, выполните запрос вставки для таблицы retaildata. В основном, бизнес дал один Excel, и я передаю эти данные в таблицу massupdate, а затем сравниваю с основной таблицей retaildata.

Я написал такой запрос, но он не правильный:

IF EXISTS (SELECT retail_id FROM retaildata WHERE retail_id in (select   retail_id from massupdate))

BEGIN

    UPDATE S SET s.Qty= C.Qty FROM retaildata S inner join massupdate C on S.retail_id=C.retail_id

END
ELSE
BEGIN

    INSERT INTO retaildata (retail_id,Qty,Trigger_Suppress,Next_Ship_Date,Next_Ship_Qty,Last_Ship_Date,Last_Ship_Qty,Carrier_Text,Ship_Number,Work_Pack_Code,Supplier_Part_Number,Supplier_Inv_Qty,Ship_Comments,Last_Updt_User,Last_Updt_Date)

    SELECT     retail_id,Qty,'N',null,null,null,null,null,null,null,null,null,null,'BATCH TRRIGER INSERT/UPDATE',Getdate() FROM massupdate END

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Мы всегда должны использовать оператор MERGE всякий раз, когда используется логика вставки / обновления c.

0 голосов
/ 19 марта 2020

Эти типы ситуаций обычно обрабатываются оператором слияния. Как-то так должно начаться

create table #retaildata (retail_id int,Qty int,Trigger_Suppress nvarchar(max),Next_Ship_Date datetime,Next_Ship_Qty datetime,Last_Ship_Date datetime,Last_Ship_Qty datetime,Carrier_Text datetime,
                            Ship_Number int,Work_Pack_Code nvarchar(max),Supplier_Part_Number int,Supplier_Inv_Qty int, Ship_Comments nvarchar(max),Last_Updt_User nvarchar(max),Last_Updt_Date datetime);

create table #massupdate (retail_id int,Qty int);

insert #retaildata (retail_id, Qty, Trigger_Suppress, Last_Updt_User) values (1, 3, 'TEST', 'Previous insert');

insert #massupdate values (1, 5), (2, 1);

select * from #retaildata;

MERGE #retaildata as target
using
(select retail_id, Qty,'N' as Trigger_suppress,null as Next_Ship_date ,null as Next_Ship_Qty,null as Last_Ship_Date ,null as Last_Ship_Qty,null as Carrier_Text,null as Ship_Number,null as Work_Pack_Code,null as Supplier_Part_Number,
null as Supplier_Inv_Qty,null as Ship_Comments,'BATCH-TRRIGER INSERT/UPDATE' as Last_Updt_User,Getdate() as Last_Updt_Date FROM #massupdate) as source
on target.retail_id=source.retail_id
when matched then update set target.Qty=source.Qty
when not matched then insert (retail_id,Qty,Trigger_Suppress,Next_Ship_Date,Next_Ship_Qty,Last_Ship_Date,Last_Ship_Qty,Carrier_Text,Ship_Number,Work_Pack_Code,Supplier_Part_Number,Supplier_Inv_Qty,
       Ship_Comments,Last_Updt_User,Last_Updt_Date)
       values (retail_id,Qty,Trigger_Suppress,Next_Ship_Date,Next_Ship_Qty,Last_Ship_Date,Last_Ship_Qty,Carrier_Text,Ship_Number,Work_Pack_Code,Supplier_Part_Number,Supplier_Inv_Qty,
       Ship_Comments,Last_Updt_User,Last_Updt_Date);

select * from #retaildata;
drop table #massupdate, #retaildata;
...