0

我将使用 MERGE 插入或更新表,具体取决于它是否存在。这是我的查询,

declare @t table
(
    id int,
    name varchar(10)
)
insert into @t values(1,'a')

MERGE INTO @t t1
USING (SELECT id FROM @t WHERE ID = 2) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
    UPDATE SET name = 'd', id = 3
WHEN NOT MATCHED THEN
    INSERT (id, name)
    VALUES (2, 'b');

select * from @t;

结果是,

id  name
1   a

我觉得应该是

id  name
1   a
2   b
4

4 回答 4

3

你的USING部分有点混乱,这就是放置你想要匹配的东西的地方(尽管在这种情况下你只使用id

declare @t table
(
    id int,
    name varchar(10)
)

insert into @t values(1,'a')

MERGE INTO @t t1
USING (SELECT 2, 'b') AS t2 (id, name) ON (t1.id = t2.id)
WHEN MATCHED THEN
    UPDATE SET name = 'd', id = 3
WHEN NOT MATCHED THEN
    INSERT (id, name)
    VALUES (2, 'b');

select * from @t;
于 2013-07-03T12:03:26.750 回答
2

正如 Mikhail 指出的,您在USING子句中的查询不包含任何行。

如果要进行 upsert,请将新数据放入USING子句中:

MERGE INTO @t t1
USING (SELECT 2 as id, 'b' as name) t2 ON (t1.id = t2.id) --This no longer has an artificial dependency on @t
WHEN MATCHED THEN
    UPDATE SET name = t2.name
WHEN NOT MATCHED THEN
    INSERT (id, name)
    VALUES (t2.id, t2.name);
于 2013-07-03T12:04:13.713 回答
1

此查询不会返回任何内容:

SELECT id FROM @t WHERE ID = 2

因为哪里没有ID = 2的表中的行,所以没有任何东西可以合并到表中。


此外,在 MATCHED 子句中,您正在更新要加入表的字段 ID,我认为这是被禁止的。

于 2013-07-03T11:56:58.113 回答
0

对于您必须提交的每个 DML 操作(标志着事务成功的结束)然后只有您才能看到最新数据

例如 :

GO
BEGIN TRANSACTION;
GO
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION;
GO
于 2013-07-03T12:00:24.383 回答