如何使用merge命令

时间:2010-06-16 20:07:36

标签: sql tsql sql-server-2008

假设我有一个名为Employee的表(包含IDNAMEADDRESSPHONE列。 (不是我真正的问题,而是简化以使问题更容易。)

如果我拨打名为UpdateEmployee的短信,我会传递@Name@Address@Phone@ID

可以使用合并来轻松检查ID是否存在?如果它确实更新了名称,地址和电话?如果不插入它们?

我在网上看到了一些例子,但它们很庞大而且毛茸茸。如果可能的话,我想要一个很好的简单例子。

(我们最近升级到SQL 2008,所以我不熟悉merge命令。)

2 个答案:

答案 0 :(得分:7)

Bill Karwin的代码几乎是正确的。我做了必要的改变。使用变量值可以让您看到它的实际效果。 表:

CREATE TABLE [dbo].[employee](
    [ID] [int] NULL,
    [Name] [char](20) NULL,
    [Address] [char](20) NULL,
    [Phone] [int] NULL
) ON [PRIMARY]

代码:

DECLARE @ID int, @NAME char(20), @ADDRESS char(20), @PHONE int
SET @ID=2
SET @NAME='Jenny'
SET @ADDRESS='11 My St'
SET @PHONE=228326

MERGE Employee AS target
USING (SELECT @ID, @NAME, @ADDRESS, @PHONE) AS source (ID, Name, Address, Phone)
ON (target.ID = source.ID)
WHEN MATCHED THEN
  UPDATE SET NAME    = source.Name,
             ADDRESS = source.Address,
             PHONE   = source.Phone
WHEN NOT MATCHED THEN
  INSERT (ID, NAME, ADDRESS, PHONE) 
  VALUES (source.ID, source.Name, source.Address, source.Phone);

答案 1 :(得分:5)

我没有对此进行过测试,但基于docs这可能会让您走上正轨:

MERGE myschema.Employee AS target
USING (SELECT @ID, @NAME, @ADDRESS, @PHONE) AS source (ID, Name, Address, Phone)
ON (target.ID = source.ID)
WHEN MATCHED THEN
  UPDATE SET NAME    = source.Name
             ADDRESS = source.Address
             PHONE   = source.Phone
WHEN NOT MATCHED THEN
  INSERT (ID, NAME, ADDRESS, PHONE) 
  VALUES (source.ID, source.Name, source.Address, source.Phone)