如何编写 SQL 脚本以在表中插入/更新数据

Posted

技术标签:

【中文标题】如何编写 SQL 脚本以在表中插入/更新数据【英文标题】:How to write a SQL Script to Insert/Update Data in table 【发布时间】:2020-03-19 08:35:10 【问题描述】:

在 SQL Server 中,我有一个名为 - massupdate 的临时表和一个名为 retaildata 的主表

结构如下。

表批量更新:

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

表零售数据:

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

retaildata 也有更多列,但这两个与 temptable massupdate 相同。

基本上应该发生的是,如果retaildata 中存在massupdate 表中的retail_id,则使用massupdate 表中的qty 更新retaildata 表中的qty。如果massupdate 中的retail_id 不存在于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

【问题讨论】:

postgres 还是 sql-server? SQL Server @Jens 您描述的是MERGE @larnu - 是的,你是对的 【参考方案1】:

这些类型的情况通常由合并语句处理。这样的事情应该让你开始

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;

【讨论】:

此查询出错 - 关键字“AS”附近的语法不正确。 我将创建一个数据存根,以便您有一个可以运行的示例 请查看更新后的查询,这是一个可运行的示例 我还包含了您的示例数据来演示更新和插入行为。 非常感谢您的帮助@Dwight【参考方案2】:

只要涉及插入/更新逻辑,我们就必须始终使用 MERGE 语句。

【讨论】:

以上是关于如何编写 SQL 脚本以在表中插入/更新数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL/SQL 中增量集成数据

如何使用 PL/SQL 中的过程在表中插入多个值?

如何使用 sql Bulkcopy 在表中插入 datagridview 行

如何在sql创建一条插入数据的存储过程

SQL 在表中插入

从存储过程结果集中在表上插入/更新数据