我有一个存储过程,它将向表中插入一条记录。我已经在表上创建了唯一键约束,以避免重复记录。
尽管定义了唯一键约束,但我使用IF()条件(在INSERT语句之前)来检查可能已经存在的重复记录。
但是,我用来检查重复记录的条件语句似乎对是否执行INSERT没有影响。-即,当一个重复的记录被提交给存储过程时,“违反唯一键约束...”抛出异常。
下面是我的存储过程示例:
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我的语法有问题吗?或者,也许我走错了路?
发布于 2010-10-02 06:15:02
如果您使用的是SQL Server2008或更高版本,则应使用MERGE语句:
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)发布于 2010-10-02 06:09:23
发布于 2010-10-02 06:04:04
这是更安全的并发性:
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:
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
ENDhttps://stackoverflow.com/questions/3843319
复制相似问题