Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写SQL脚本在表中插入/更新数据_Sql_Sql Server_Insert Update_Sql Scripts - Fatal编程技术网

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

如何编写SQL脚本在表中插入/更新数据,sql,sql-server,insert-update,sql-scripts,Sql,Sql Server,Insert Update,Sql Scripts,在SQL Server中,我有一个名为-massupdate的临时表和一个名为retaildata 结构如下 表massupdate: | retail_id | Qty| | 1 | 1 | | 2 | 2 | 表1数据: | retail_id | Qty| | 1 | 1 | | 2 | 2 | retaildata也有更多的列,但这两个列与诱惑massu

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

结构如下

表massupdate:

| retail_id     | Qty| 
| 1             | 1  | 
| 2             | 2  | 
表1数据:

| retail_id     | Qty| 
| 1             | 1  | 
| 2             | 2  | 
retaildata
也有更多的列,但这两个列与诱惑
massupdate
相同

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

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

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;

每当涉及插入/更新逻辑时,我们必须始终使用MERGE语句。

postgres或sql server?sql server@jensy您描述的是
MERGE
@larnu-是,您是对的,此查询出现错误-关键字“AS”附近的语法不正确。我将创建一个数据存根,以便您有一个可以运行bear的示例。请参阅更新的查询,这是一个可运行的示例。我还包含了您的示例数据,以演示更新和插入行为。非常感谢您@Dwight的帮助