我正在尝试使用merge来组合更新和插入语句,虽然我收到一些错误,我不太确定它是对的。 merge语句位于存储过程中。以下是合并声明。
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]);
这是我第一次使用merge,希望能得到一些帮助。
全部谢谢
答案 0 :(得分:0)
您的合并声明存在一些问题。这是你可能想要的。
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
);
注意(1)更新表格时,不要在每列之后写and
,而只是添加逗号。 (2)如果您使用Source
和Target
作为表别名,那么您应该坚持使用它们并且不要在中间更改为s
而不是source
}。
上面的代码仍然可能不起作用,因为(在代码的末尾)它试图在target
表中插入比source
表中更多的列。首先,您说源表包含segCreateDate,segDesc,modifiedDate和modifiedBy。但最后你还试图插入target
列segID,segCode,createdDate和createdBy。
这引出了第二个问题,为什么上面的代码无法工作:你试图在segID上加入源和目标。我无法判断目标表dbo.seg中是否存在此列。但是这个列肯定不包含在上面定义的源表中。