Sql 用于更新和插入的merge语句
我试图使用merge来组合update和insert语句,尽管我遇到了一些错误,我不太确定它是否正确。merge语句位于存储过程中。下面是merge语句Sql 用于更新和插入的merge语句,sql,tsql,merge,dml,Sql,Tsql,Merge,Dml,我试图使用merge来组合update和insert语句,尽管我遇到了一些错误,我不太确定它是否正确。merge语句位于存储过程中。下面是merge语句 MERGE dbo.seg AS TARGET USING (SELECT segCreateDate , segDesc , modifiedDate , modifiedBy FROM [update].[dbo].[seg] s ) AS source (segCreate
MERGE dbo.seg AS TARGET
USING (SELECT segCreateDate
, segDesc
, modifiedDate
, modifiedBy
FROM [update].[dbo].[seg] s
) AS source (segCreateDate
, segDesc
, modifiedDate
, modifiedBy)
ON (dbo.[seg].segID = s.segID
AND (
dbo.[seg].segCreateDate > s.segCreateDate
OR dbo.[seg].segDesc <> s.segDesc
)
)
WHEN MATCHED THEN
UPDATE dbo.seg SET
target.segCreateDate = source.segCreateDate
AND target.segDesc = source.segDesc
AND target.modifiedDate = source.modifiedDate
AND target.modifiedBy = source.modifiedBy
WHEN NOT MATCHED THEN
INSERT (segID
, segCode
, segDesc
, segCreateDate
, createdDate
, createdBy
, modifiedDate
, modifiedBy
)
VALUES (SELECT segID
,segCode
,segDesc
,segCreateDate
,createdDate
,createdBy
,modifiedDate
,modifiedBy
FROM [update].[dbo].[seg]);
将dbo.seg合并为目标
使用(选择segCreateDate)
,segDesc
,修饰
,由
来自[update].[dbo].[seg]s
)作为源(segCreateDate)
,segDesc
,修饰
,经修改)
在(dbo.[seg].segID=s.segID上
及(
dbo.[seg].segCreateDate>s.segCreateDate
或dbo[seg].segDesc s.segDesc
)
)
当匹配时
更新dbo.seg集
target.segCreateDate=source.segCreateDate
和target.segDesc=source.segDesc
并且target.modifiedDate=source.modifiedDate
并且target.modifiedBy=source.modifiedBy
当不匹配时
插入(segID)
,segCode
,segDesc
,segCreateDate
,createdDate
,由
,修饰
,由
)
值(选择segID
,segCode
,segDesc
,segCreateDate
,createdDate
,由
,修饰
,由
来自[update].[dbo].[seg];
这是我第一次使用merge,希望能得到一些帮助
谢谢大家您的合并语句有几个问题。这可能是你想要的
merge dbo.seg as TARGET
using
(
select segCreateDate,
segDesc,
modifiedDate,
modifiedBy
from [update].dbo.seg s
) as source (segCreateDate, segDesc, modifiedDate, modifiedBy)
on (
TARGET.segID = source.segID
and (
TARGET.segCreateDate > source.segCreateDate
or TARGET.segDesc <> source.segDesc
)
)
when matched then
update set TARGET.segCreateDate = source.segCreateDate,
TARGET.segDesc = source.segDesc,
TARGET.modifiedDate = source.modifiedDate,
TARGET.modifiedBy = source.modifiedBy
when not matched then
insert (
segID,
segCode,
segDesc,
segCreateDate,
createdDate,
createdBy,
modifiedDate,
modifiedBy
)
values (
source.segID,
source.segCode,
source.segDesc,
source.segCreateDate,
source.createdDate,
source.createdBy,
source.modifiedDate,
source.modifiedBy
);
将dbo.seg合并为目标
使用
(
选择segCreateDate,
塞格迪斯,
修改的日期,
修改
来自[update].dbo.seg s
)作为源(segCreateDate、segDesc、modifiedDate、modifiedBy)
在(
TARGET.segID=source.segID
及(
TARGET.segCreateDate>source.segCreateDate
或TARGET.segDesc source.segDesc
)
)
当匹配时
更新设置TARGET.segCreateDate=source.segCreateDate,
TARGET.segDesc=source.segDesc,
TARGET.modifiedDate=source.modifiedDate,
TARGET.modifiedBy=source.modifiedBy
当不匹配时
插入(
塞吉德,
segCode,
塞格迪斯,
segCreateDate,
创建日期,
由,
修改的日期,
修改
)
价值观(
source.segID,
source.segCode,
source.segDesc,
source.segCreateDate,
source.createdDate,
source.createdBy,
source.modifiedDate,
source.modifiedBy
);
请注意,(1)在更新表时,您不会在每列之后写入和,而只是添加一个逗号。(2)如果使用<代码>源<代码> >代码>目标< /代码>作为表别名,则应坚持它们,不要在中间更改为<代码> s>代码>而不是<代码>源<代码> >
尽管如此,上述代码仍可能无法工作,因为(在代码末尾)它试图在目标
表中插入比源
表中更多的列。首先,您说源表由segCreateDate、segDesc、modifiedDate和modifiedBy组成。但在最后,您还试图将segID、segCode、createdDate和createdBy列插入到target
中
这就引出了第二个问题,为什么上面的代码无法工作:您正试图在segID上连接源代码和目标代码。我无法判断目标表dbo.seg中是否存在此列。但是这个列肯定不包含在上面定义的源表中。您的问题是什么?在更新时,我在那里错误地说“dbo附近的语法不正确”@Radu@Randy我的问题是我不认为我写的是有效的。我使用的逻辑正确吗?我觉得这是错误的。。[更新].[dbo].[seg]ya我几分钟前在这里看到,我正要编辑它。它实际上是update.dbo.seg,sql对此很满意。在update语句中,dbo带红色下划线,在值中,选择,最后一个箭头也带红色下划线。我对这件事很困惑