开发者

SQL 2008 R2: Trying to get the T-SQL MERGE statement working in a stored procedure

I have looked at various example of the SQL Merge statement.. all of which look excellent, albeit for some reason I cannot seem to get the correct/expected results from my Merge test.

Quick overview: I have a simple table with some design data in it.. and reading about MERGE seems to point to a more efficient way of doing an 'upsert' (i.e: an Insert or Update depending if the record exists or not).

So the SQL 2008 code goes something like this (sorry if it is not fully complete, as I am working on it!):

This will be in a stored procedure, so the @values are obviously the passed params..

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)

The issue seems to be out of the 7 records I am testing with, ALL of them seem to be updated, when clearly I can only see one record that matches the update.. and the strange thing is if I pass some NEW data (designname and designcode), I seem to get a repeating insert.. from my last test it seemed 7 new inserts which I am guessing isn't just a fluke.开发者_运维知识库.

Hope I have explained this correctly.. part of attacking something new is mostly getting the context correct right?

Thanks in advance for any feedback.

P.S: Sorry, there is a semi-colon at the end of the merge statement! to complete the parse checking/syntax.


You're using designs as both the target and the source table:

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

This is equivalent to:

merge designs as ds
using designs as dsi

Instead, try to pass the variables as the source table:

merge designs as ds
using (
      select  @passedDesignName as designname
      ,       @passedDesignCode as designcode
      ) as dsi
on (ds.esignName = dsi.designname and ds.designCode = dsi.designcode)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜