【问题标题】:If value exist in table dont insert and return its id, else insert and return scope identity如果表中存在值,则不插入并返回其 id,否则插入并返回范围标识
【发布时间】:2017-05-18 14:30:14
【问题描述】:

我已经编写了一个 sql 查询来插入记录,如果它不存在并返回它的范围标识。

IF NOT EXISTS(SELECT email from tableUser
where email='a@b.com')
INSERT INTO tableUser (name, countryCode, mobile, email, ip)
VALUES ('name', 91, 9811223344, 'a@b.com', 1)  SELECT SCOPE_IDENTITY()

但如果记录存在,那么我想返回它的 ID。

注意:ID 是表中的标识列

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    试试下面的查询:

       IF NOT EXISTS(SELECT email from tableUser where email='a@b.com')
       BEGIN
           INSERT INTO tableUser (name, countryCode, mobile, email, ip)
           VALUES ('name', 91, 9811223344, 'a@b.com', 1)  
    
           SELECT SCOPE_IDENTITY()
       END
       ELSE 
       BEGIN
    
          SELECT Id FROM tableUser where email='a@b.com'
    
       END
    

    【讨论】:

    • 谢谢,但您建议的是存储过程。是否可以仅使用简单查询来执行它?
    【解决方案2】:

    您可以将MERGEOUTPUT 子句一起使用。比如:

    MERGE INTO tableUser t
    USING (VALUES('name',91,'9811223344','a@b.com',1)) s(name, countryCode, mobile, email, ip)
    ON t.email = s.email
    WHEN NOT MATCHED THEN INSERT (name, countryCode, mobile, email, ip) 
                         values(s.name,s.countryCode,s.mobile,s.email,s.ip)
    WHEN MATCHED THEN UPDATE set ip = t.ip /* No change */
    OUTPUT inserted.ID;
    

    (请注意,我也将移动设备更改为文本 - 尽管手机号码由数字组成,但我们不会对它们进行数学运算,并且通常例如前导零可能很重要,因此通常最好不要存储它们作为实际数字)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2019-09-06
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多