看起来您正在尝试使用无法转换为日期或日期时间类型的 char 或 varchar 类型数据更新日期或日期时间类型列。 'a' 不能转换为日期或日期时间。看看我下面的第一个和第二个 Merge。如果你没有提到匹配时或不匹配时源或目标,默认情况下它考虑目标。
--DROP TABLE #A;
--DROP TABLE #B;
CREATE TABLE #A
(
ipval VARCHAR(50)
, domain CHAR(5)
, dateStart DATE
, dateUpdate DATE
, dateFinish DATE
, link VARCHAR(50)
);
CREATE TABLE #B
(
ipval VARCHAR(50)
, domain CHAR(5)
, dateStart DATE
, dateUpdate DATE
, dateFinish DATE
, link VARCHAR(50)
);
INSERT INTO #B
( ipval, domain, dateStart, dateUpdate, dateFinish, link )
VALUES ( '42.130.239.56' -- ipval - varchar(50)
, '.com' -- domain - char(5)
, GETDATE() -- dateStart - date
, DATEADD(DAY, 1, GETDATE()) -- dateUpdate - date
, DATEADD(DAY, 5, GETDATE()) -- dateFinish - date
, 'www.stackoverflow' -- link - varchar(50)
),
( '78.188.136.74' -- ipval - varchar(50)
, '.com' -- domain - char(5)
, GETDATE() -- dateStart - date
, DATEADD(DAY, 2, GETDATE()) -- dateUpdate - date
, DATEADD(DAY, 10, GETDATE()) -- dateFinish - date
, 'www.msdn' -- link - varchar(50)
);
INSERT INTO #A
( ipval, domain, dateStart, dateUpdate, dateFinish, link )
VALUES ( '30.48.111.20' -- ipval - varchar(50)
, '.com' -- domain - char(5)
, GETDATE() -- dateStart - date
, DATEADD(DAY, 5, GETDATE()) -- dateUpdate - date
, DATEADD(DAY, 10, GETDATE()) -- dateFinish - date
, 'www.msdn' -- link - varchar(50)
),
( '30.48.111.20' -- ipval - varchar(50)
, '.com' -- domain - char(5)
, GETDATE() -- dateStart - date
, DATEADD(DAY, 5, GETDATE()) -- dateUpdate - date
, DATEADD(DAY, 10, GETDATE()) -- dateFinish - date
, 'www.gmail' -- link - varchar(50)
);
--First Merge
BEGIN TRAN;
MERGE #A AS T
USING #B AS tmp
ON T.domain = tmp.domain
AND T.link = tmp.link
WHEN NOT MATCHED BY TARGET THEN
INSERT ( ipval
, domain
, dateStart
, dateUpdate
, dateFinish
, link
)
VALUES ( tmp.ipval
, tmp.domain
, tmp.dateStart
, tmp.dateUpdate
, tmp.dateFinish
, tmp.link
)
WHEN MATCHED THEN
UPDATE SET T.dateUpdate = tmp.dateUpdate
WHEN NOT MATCHED BY SOURCE THEN
UPDATE SET T.dateFinish =''a'';
COMMIT TRAN;
GO
SELECT *
FROM #A;
SELECT *
FROM #B;
--Second Merge
BEGIN TRAN;
MERGE #A AS T
USING #B AS tmp
ON T.domain = tmp.domain
AND T.link = tmp.link
WHEN NOT MATCHED BY TARGET THEN
INSERT ( ipval
, domain
, dateStart
, dateUpdate
, dateFinish
, link
)
VALUES ( tmp.ipval
, tmp.domain
, tmp.dateStart
, tmp.dateUpdate
, tmp.dateFinish
, tmp.link
)
WHEN MATCHED THEN
UPDATE SET T.dateUpdate = tmp.dateUpdate
WHEN NOT MATCHED BY SOURCE THEN
UPDATE SET T.dateFinish = CAST(GETDATE() AS DATE);
COMMIT TRAN;
GO
SELECT *
FROM #A;
SELECT *
FROM #B;