我有以下几点 MERGE
声明:
MERGE TargetTable t
USING SourceTable s ON (t.ID = s.ID)
WHEN MATCHED
AND EXISTS (SELECT s.Day, s.Date, s.Name
EXCEPT
SELECT t.Day, t.Date, t.Name)
THEN UPDATE
SET t.Day = s.Day,
t.Date = s.Date,
t.Name = s.Name
WHEN NOT MATCHED BY TARGET
THEN INSERT (ID, Day, Date, Name)
VALUES (s.ID, s.Day, s.Date, s.Name);
有更多的专栏,但我只是缩短它,以便于阅读。
所以当我运行这个时,它工作得很好,除了:如果我在源表中更改某个东西的大小写,它在目标表中不会得到更新。我相信这个问题可以通过对utf8使用collate来解决,但是我无法理解。
edit:如果我在源表中更改了某些内容,我的意思是:出于测试目的,我将执行合并,然后更改varchar字段,但只更改字母的大小写。然后,当我再次运行merge时,更改不会传播到目标表,因为它不会将更改视为不区分大小写的更改
谢谢
1条答案
按热度按时间qco9c6ql1#
使用区分大小写的排序规则来限定列。
假设varchar列是用不区分大小写的排序规则定义的
SQL_Latin1_General_CP1_CI_AS
(显式地,或者作为数据库的默认方式)。使用except的子查询将变成:这个
CS
在排序规则中,name表示区分大小写。这个CI
不区分大小写。