【Merge】写法报错

不胖到130不改名字 2019-08-08 10:28:18
a表是原表
c表示目标表
表结构都是一样的

CREATE TABLE [dbo].[a](
[pgvl_id] [INT] IDENTITY(1,1) NOT NULL,
[pgvl_serial_number] [VARCHAR](50) NOT NULL,
[pgvl_wo_nbr] [VARCHAR](20) NULL,
[pgvl_part] [VARCHAR](20) NULL,
[pgvl_machine_name] [VARCHAR](50) NOT NULL,
[pgvl_terminal_id] [INT] NOT NULL,
[pgvl_step_seq] [VARCHAR](50) NULL,
[pgvl_step_name] [VARCHAR](100) NULL,
[pgvl_item_name] [VARCHAR](50) NULL,
[pgvl_item_para] [VARCHAR](400) NULL,
[pgvl_lsl] [VARCHAR](50) NULL,
[pgvl_usl] [VARCHAR](50) NULL,
[pgvl_values] [VARCHAR](50) NULL,
[pgvl_result] [VARCHAR](10) NULL,
[isenable] [INT] NOT NULL,
[modtime] [DATETIME] NOT NULL,
[acctid] [INT] NOT NULL,
[sid] [INT] NOT NULL
) ON [PRIMARY]


下面是merge写法


SET IDENTITY_INSERT test.dbo.c ON;

MERGE INTO test.dbo.c AS t
USING test.dbo.a AS s
ON (t.pgvl_id = s.pgvl_id)
--目标数据表存在该数据
WHEN MATCHED
THEN UPDATE SET t.pgvl_serial_number=s.pgvl_serial_number,
t.pgvl_wo_nbr=s.pgvl_wo_nbr,
t.pgvl_part=s.pgvl_part,
t.pgvl_machine_name=s.pgvl_machine_name,
t.pgvl_terminal_id=s.pgvl_terminal_id,
t.pgvl_step_seq=s.pgvl_step_seq,
t.pgvl_step_name=s.pgvl_step_name,
t.pgvl_item_name=s.pgvl_item_name,
t.pgvl_item_para=s.pgvl_item_para,
t.pgvl_lsl=s.pgvl_lsl,
t.pgvl_usl=s.pgvl_usl,
t.pgvl_values=s.pgvl_values,
t.pgvl_result=s.pgvl_result,
t.isenable=s.isenable,
t.modtime=s.modtime,
t.acctid=s.acctid,
t.sid=s.sid
--目标数据表不存在该数据
WHEN NOT MATCHED
THEN INSERT VALUES(s.pgvl_id,
s.pgvl_serial_number,
s.pgvl_wo_nbr,
s.pgvl_part,
s.pgvl_machine_name,
s.pgvl_terminal_id,
s.pgvl_step_seq,
s.pgvl_step_name,
s.pgvl_item_name,
s.pgvl_item_para,
s.pgvl_lsl,
s.pgvl_usl,
s.pgvl_values,
s.pgvl_result,
s.isenable,
s.modtime,
s.acctid,
s.sid)
--源数据表不存在该数据
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

SET IDENTITY_INSERT test.dbo.c OFF;


一直报错

消息 102,级别 15,状态 1,第 3 行
'MERGE' 附近有语法错误。
...全文
159 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不过为什么我数据库明明是2008 R2 兼容模式却选不了2008?
  • 打赏
  • 举报
回复
知道原因了 数据库=》选项=》兼容模式要设置2008
二月十六 2019-08-08
  • 打赏
  • 举报
回复


SET IDENTITY_INSERT test.dbo.c ON;

MERGE INTO test.dbo.c AS t
USING test.dbo.a AS s
ON (t.pgvl_id = s.pgvl_id)
--目标数据表存在该数据
WHEN MATCHED
THEN UPDATE SET t.pgvl_serial_number=s.pgvl_serial_number,
t.pgvl_wo_nbr=s.pgvl_wo_nbr,
t.pgvl_part=s.pgvl_part,
t.pgvl_machine_name=s.pgvl_machine_name,
t.pgvl_terminal_id=s.pgvl_terminal_id,
t.pgvl_step_seq=s.pgvl_step_seq,
t.pgvl_step_name=s.pgvl_step_name,
t.pgvl_item_name=s.pgvl_item_name,
t.pgvl_item_para=s.pgvl_item_para,
t.pgvl_lsl=s.pgvl_lsl,
t.pgvl_usl=s.pgvl_usl,
t.pgvl_values=s.pgvl_values,
t.pgvl_result=s.pgvl_result,
t.isenable=s.isenable,
t.modtime=s.modtime,
t.acctid=s.acctid,
t.sid=s.sid
--目标数据表不存在该数据
WHEN NOT MATCHED
THEN INSERT(pgvl_id,
pgvl_serial_number,
pgvl_wo_nbr,
pgvl_part,
pgvl_machine_name,
pgvl_terminal_id,
pgvl_step_seq,
pgvl_step_name,
pgvl_item_name,
pgvl_item_para,
pgvl_lsl,
pgvl_usl,
pgvl_values,
pgvl_result,
isenable,
modtime,
acctid,
sid) VALUES(s.pgvl_id,
s.pgvl_serial_number,
s.pgvl_wo_nbr,
s.pgvl_part,
s.pgvl_machine_name,
s.pgvl_terminal_id,
s.pgvl_step_seq,
s.pgvl_step_name,
s.pgvl_item_name,
s.pgvl_item_para,
s.pgvl_lsl,
s.pgvl_usl,
s.pgvl_values,
s.pgvl_result,
s.isenable,
s.modtime,
s.acctid,
s.sid)
--源数据表不存在该数据
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

SET IDENTITY_INSERT test.dbo.c OFF;
  • 打赏
  • 举报
回复
数据库是2008 R2

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧