MERGE语句未更新

Bra*_*ock 1 sql t-sql sql-server merge

在SQL Server上执行以下操作时,我希望使用值88888888更新NULL,但它会插入一个新行.有人可以告诉我我做错了什么吗?

USE tempdb;

CREATE TABLE TableA (ColA CHAR(8), ColB CHAR(8))
CREATE TABLE TableB (ColA CHAR(8), ColB CHAR(8))

INSERT INTO TableA VALUES  ( 'XXXXXXXX', NULL )
INSERT INTO TableA VALUES  ( 'XXXXXXXX', '88888888')

MERGE INTO TableB AS T
USING TableA AS S
ON T.ColA = S.ColA and T.ColB = S.ColB
WHEN MATCHED 
    THEN
      UPDATE
         SET T.ColA = S.ColA, T.ColB = S.ColB
WHEN NOT MATCHED BY TARGET 
    THEN
      INSERT (ColA, ColB) VALUES (S.ColA, S.ColB);

SELECT  * FROM    TableA
SELECT  * FROM    TableB

DROP TABLE TableA
DROP TABLE TableB
Run Code Online (Sandbox Code Playgroud)

非常感谢!最诚挚的问候,史蒂夫

Dam*_*ver 5

a)表本质上是无序的.即使(正如您所期望的那样)合并一次进行一行(见c下文),也没有理由不会在行之前看到两行都为非null的行为nullColB

B)您ON子句指定要在两者匹配ColAColB.这两行中至少有一行是不同的,所以我希望两行都不匹配一行TableB,而且

c)应用SQL语句,就好像所有行同时受到并行影响一样.它不处理一行,然后移动到下一行.所以从来没有一个场合只有一排TableB.

不幸的是,你发布的内容显然是一个"玩具"的例子,所以我不能提供任何关于如何修复它的建议 - 你没有告诉我们真实情况是什么,真实数据是什么样的,为什么你正在使用MERGE