如何将 SQL 脚本写入 Insert/Update 中的数据 table
How to write a SQL Script to Insert/Update Data in table
在 SQL 服务器中,我有一个名为 - massupdate
的临时 table 和一个名为 retaildata
的主要 table
结构如下
Table 批量更新:
| retail_id | Qty|
| 1 | 1 |
| 2 | 2 |
Table零售数据:
| retail_id | Qty|
| 1 | 1 |
| 2 | 2 |
retaildata
也有更多的列,但这 2 个与 temptable massupdate
.
相同
基本上应该发生的是,如果 massupdate
中的 retail_id
table 存在于 retaildata
中,则更新 retaildata
中的 qty
table 与 qty
共 massupdate
table。如果 massupdate
的 retail_id
不存在于 retaildata
table 中,则对 retaildata
table 进行插入查询。基本上,业务给了一个 Excel,我在 massupdate
table 中提供这些数据,然后与主要 table 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
这些类型的情况通常由合并语句处理。这样的事情应该让你开始
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;
每当涉及 Insert/Update 逻辑时,我们必须始终使用 MERGE 语句。
在 SQL 服务器中,我有一个名为 - massupdate
的临时 table 和一个名为 retaildata
结构如下
Table 批量更新:
| retail_id | Qty|
| 1 | 1 |
| 2 | 2 |
Table零售数据:
| retail_id | Qty|
| 1 | 1 |
| 2 | 2 |
retaildata
也有更多的列,但这 2 个与 temptable massupdate
.
基本上应该发生的是,如果 massupdate
中的 retail_id
table 存在于 retaildata
中,则更新 retaildata
中的 qty
table 与 qty
共 massupdate
table。如果 massupdate
的 retail_id
不存在于 retaildata
table 中,则对 retaildata
table 进行插入查询。基本上,业务给了一个 Excel,我在 massupdate
table 中提供这些数据,然后与主要 table 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
这些类型的情况通常由合并语句处理。这样的事情应该让你开始
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;
每当涉及 Insert/Update 逻辑时,我们必须始终使用 MERGE 语句。