首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T-SQL IF条件未按预期工作

T-SQL IF条件未按预期工作
EN

Stack Overflow用户
提问于 2010-10-02 05:58:57
回答 5查看 653关注 0票数 1

我有一个存储过程,它将向表中插入一条记录。我已经在表上创建了唯一键约束,以避免重复记录。

尽管定义了唯一键约束,但我使用IF()条件(在INSERT语句之前)来检查可能已经存在的重复记录。

但是,我用来检查重复记录的条件语句似乎对是否执行INSERT没有影响。-即,当一个重复的记录被提交给存储过程时,“违反唯一键约束...”抛出异常。

下面是我的存储过程示例:

代码语言:javascript
复制
BEGIN       
    if
        (SELECT Count(f1)
        FROM table
        WHERE f1 = @f1
        AND f2= @f2) 
    <= 0
    BEGIN
        INSERT INTO table
        (f1,f2)
        VALUES
        (@f1, @f2)

        RETURN @@IDENTITY
    END
END

我的语法有问题吗?或者,也许我走错了路?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-02 06:15:02

如果您使用的是SQL Server2008或更高版本,则应使用MERGE语句:

代码语言:javascript
复制
MERGE INTO table AS t
USING (VALUES (@f1, @f2)) AS s (f1, f2)
    ON s.f1 = t.f1
        AND s.f2 = t.f2
WHEN NOT MATCHED BY t THEN
    INSERT (f1, f2) VALUES (@f1, @f2)
票数 3
EN

Stack Overflow用户

发布于 2010-10-02 06:09:23

Count(field)对非null的值进行计数。

这可能不同于计算行数的count(*)

但我不鼓励在这里使用count

看看this question吧。

票数 3
EN

Stack Overflow用户

发布于 2010-10-02 06:04:04

这是更安全的并发性:

代码语言:javascript
复制
INSERT INTO table
SELECT @f1, @f2, @f3
  FROM TABLE WITH (UPDLOCK, HOLDLOCK)
 WHERE NOT EXISTS(SELECT NULL
                    FROM table
                   WHERE f1 = @f1
                     AND f2 = @f2
                     AND f3 = @f3) 

或者,如果您希望保持决策逻辑(但不太安全),请使用NOT EXISTS:

代码语言:javascript
复制
IF NOT EXISTS(SELECT NULL
                FROM table
               WHERE f1 = @f1
                 AND f2 = @f2
                 AND f3 = @f3) 
BEGIN

    INSERT INTO table
      (f1,f2, f3)
    VALUES
      (@f1, @f2, @f3)

    RETURN @@SCOPE_IDENTITY

END
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3843319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档