【问题标题】:Merge statement on a single record table单个记录表上的合并语句
【发布时间】:2013-01-16 07:27:13
【问题描述】:

我需要编写一条语句来插入或更新单个记录表中的记录

合并语句允许我这样写:

create table t1 (n int)

-- insert into t1 (n) Values (1);  -- uncomment to test the matched branch

MERGE t1 AS P
USING (SELECT 3 AS n) AS S
ON 1 = 1
WHEN MATCHED THEN
    UPDATE SET n = S.n
WHEN NOT MATCHED THEN
    INSERT (n) 
    VALUES (S.n);

select * from t1    

这项工作,但我认为 1=1 条件的目的不是很容易理解。 是否有不同的语法在表为空时插入记录或在记录已存在时更新记录?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    另一种选择是用老式的方式来做。

    if exists (select null from t1)
        update t1 set n = 3
    else
        insert into t1 (n) values (3)
    

    【讨论】:

      【解决方案2】:

      替换

      ON 1 = 1
      

      ON S.n = P.n
      

      【讨论】:

      • 我认为这会导致在S.n P.n时插入一条新记录,所以表会增长到多条记录
      【解决方案3】:

      我最近编写的更新现有行或插入新行的过程示例。 表与表变量 MembershipEmailFormat 具有相同的结构。

      发现创建一个表变量作为 Using 子句中的源是最简单的方法。我意识到 Merge 语句的主要目的实际上是在两个表之间合并多行。我的用例是我需要为用户插入一个新的电子邮件地址或修改现有的电子邮件地址。

      CREATE PROCEDURE [dbo].[usp_user_merge_emailformat]
              @UserID UNIQUEIDENTIFIER,
              @Email varchar(256),
              @UseHTML bit
      AS
      BEGIN
          --SELECT @UserID='04EFF187-AEAC-408E-9FA8-284B31890FBD',
          --       @Email='person@xxxx.com',
          --       @UseHTML=0
      
          DECLARE @temp TABLE
          (
                  UserID UNIQUEIDENTIFIER,
                  Email varchar(256),
                  HtmlFormat bit
          )       
      
          INSERT INTO @temp(UserID,Email, HtmlFormat)
          Values(@UserID,@Email,@UseHTML)
      
          SELECT * FROM @temp    
      
          MERGE dbo.MembershipEmailFormat as t
          USING @temp AS s
          ON (t.UserID = s.UserID and t.Email = s.Email)
          WHEN MATCHED THEN UPDATE SET t.HtmlFormat = s.HtmlFormat
          WHEN NOT MATCHED THEN INSERT VALUES(s.UserID,s.Email,s.HtmlFormat);
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        • 2016-03-07
        • 1970-01-01
        相关资源
        最近更新 更多