1

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

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

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

4

2 回答 2

5

a) 表格本质上是无序的。即使(如您所料)合并一次进行一行(见c下文),也没有理由在空行之前看不到两列都非空的行ColB

b)您的子句在和ON上都指定了匹配项。这两行至少在其中一个中是不同的,所以我希望这两行都不匹配, 和ColAColBTableB

c) SQL 语句的应用就像所有行同时受到影响一样。它不处理一行,然后移动到下一行。所以从来没有出现过恰好有一排的情况TableB

不幸的是,您发布的内容显然是一个“玩具”示例,因此我无法就如何修复它提供任何建议 - 您没有告诉我们真实情况是什么,真实数据是什么样的,为什么您'正在使用MERGE

于 2013-08-29T14:42:57.423 回答
2
MERGE INTO TableB AS T
USING TableA AS S
ON T.ColA = S.ColA 
WHEN MATCHED 
THEN
  UPDATE
     SET  T.ColB = S.ColB

请将此从 join:和 T.ColB = S.ColB中删除。

您还可以从更新中删除T.ColA = S.ColA,因为这些列已经具有相同的值。

于 2013-08-29T14:39:45.330 回答