用于更新和插入的合并语句
merge statement for update and insert
我正在尝试使用合并来组合更新和插入语句,尽管我遇到了一些错误并且我不太确定它是否正确。合并语句在存储过程中。以下是合并语句。
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 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) 在更新 table 时,您不会在每一列之后写上 and
,而只是添加一个逗号。 (2) 如果您使用 Source
和 Target
作为 table 别名,那么您应该坚持使用它们并且不要在中间更改为 s
而不是 source
.
上面的代码仍然可能无法工作,因为(在代码末尾)它试图插入到 target
table 中的列比 source
中的列多] table。一开始你说源 table 由 segCreateDate、segDesc、modifiedDate 和 modifiedBy 组成。但最后您还试图将 segID、segCode、createdDate 和 createdBy 列插入 target
。
这引出了上面代码无法运行的第二个问题:您正在尝试在 segID 上加入源和目标。我无法确定此列是否存在于目标 table dbo.seg 中。但是这个专栏肯定不包含在上面定义的来源table中。
我正在尝试使用合并来组合更新和插入语句,尽管我遇到了一些错误并且我不太确定它是否正确。合并语句在存储过程中。以下是合并语句。
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 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) 在更新 table 时,您不会在每一列之后写上 and
,而只是添加一个逗号。 (2) 如果您使用 Source
和 Target
作为 table 别名,那么您应该坚持使用它们并且不要在中间更改为 s
而不是 source
.
上面的代码仍然可能无法工作,因为(在代码末尾)它试图插入到 target
table 中的列比 source
中的列多] table。一开始你说源 table 由 segCreateDate、segDesc、modifiedDate 和 modifiedBy 组成。但最后您还试图将 segID、segCode、createdDate 和 createdBy 列插入 target
。
这引出了上面代码无法运行的第二个问题:您正在尝试在 segID 上加入源和目标。我无法确定此列是否存在于目标 table dbo.seg 中。但是这个专栏肯定不包含在上面定义的来源table中。