2

我查看了 SQL Merge 语句的各种示例。所有这些看起来都很棒,尽管由于某种原因,我似乎无法从 Merge 测试中获得正确/预期的结果。

快速概述: 我有一个简单的表,其中包含一些设计数据。阅读有关 MERGE 的信息似乎指向了一种更有效的“upsert”方式(即:插入或更新,取决于记录是否存在)。

所以 SQL 2008 代码是这样的(对不起,如果它不完整,因为我正在处理它!):

这将在一个存储过程中,所以 @values 显然是传递的参数..

merge designs as ds
using ( select designname, designcode from designs) as dsi
on (@passedDesignName = dsi.designname and @passedDesignCode = dsi.designcode)
when matched then
    update set ds.designname = @passedDesignName, ds.designcode = @passedDesignCode
when not matched then
    insert (designname, designcode)
    values (@passedDesignName, @passedDesignCode)

问题似乎出在我正在测试的 7 条记录中,它们似乎都已更新,但显然我只能看到一条与更新匹配的记录。奇怪的是,如果我传递了一些新数据(设计名称和设计代码),我似乎得到了一个重复的插入..从我上次的测试来看,似乎有 7 个新的插入,我猜这不仅仅是侥幸..

希望我已经正确解释了这一点。攻击新事物的一部分主要是使上下文正确吗?

提前感谢您的任何反馈。

PS:对不起,merge语句末尾有分号!完成解析检查/语法。

4

1 回答 1

5

designs同时用作目标表和源表:

merge designs as ds
using ( select designname, designcode from designs) as dsi

这相当于:

merge designs as ds
using designs as dsi

相反,尝试将变量作为源表传递:

merge designs as ds
using (
      select  @passedDesignName as designname
      ,       @passedDesignCode as designcode
      ) as dsi
on (ds.esignName = dsi.designname and ds.designCode = dsi.designcode)
于 2011-02-16T11:36:45.127 回答