更新和插入存储过程

4
我希望创建一个存储过程,如果列中不含数据库中已存在的值,则在该列上执行插入或更新操作。当COUNT(field)= 0时应允许插入;当COUNT(field)= 0或1时应允许更新。我还需要了解是否执行了这些操作。
请使用COUNT而不是Exists来解决我的问题,因为这对于UPDATE无效。
我正在ASP.net中工作-我有一个表的两列需要保持唯一,但不使用唯一约束。所以我想要这样的一个过程:
create proc usp_checkall @field1 varchar(20), 
                         @field2 varchar(20), 
                         @ID int, 
                         @count int output 

现在您的查询是基于@id更新/插入@field1和@field2


你已经尝试过什么了吗? - Michael Todd
是的,我在谈论SQL服务器。 - Abhishek Kapuria
存在比计数更好。 - user215054
存在函数不适用于更新操作。因为它会允许用户将数据输入到已经存在的表中。 - Abhishek Kapuria
4个回答

8
如果您恰好拥有SQL Server 2008,则可以尝试以下操作:
MERGE dbo.SomeTable AS target
    USING (SELECT @ID, @Field_1, @Field_2) AS source (ID, Field_1, Field_2)
        ON (target.ID = source.ID)
    WHEN MATCHED THEN 
        UPDATE SET Field_1 = source.Field_1, Field_2 = source.Field_2
    WHEN NOT MATCHED THEN   
        INSERT (ID, Field_1, Field_2)
        VALUES (source.ID, source.Field_1, source.Field_2)

1

使用:

INSERT INTO your_table
  (column)
VALUES
  ([ your_value ])
WHERE NOT EXISTS (SELECT NULL
                   FROM your_table 
                  WHERE t.column = [ your_value ])

这将适用于SQL Server、MySQL、Oracle和Postgres。只需要使用适当的数据库变量引用即可。例如:对于MySQL和SQL Server:

INSERT INTO your_table
  (column)
VALUES
  ( @your_value )
WHERE NOT EXISTS (SELECT NULL
                   FROM your_table 
                  WHERE t.column = @your_value)

如果使用SQL Server,请基于@@ROWCOUNT获取值以查看是否插入了任何内容。如果使用Oracle,请使用SQL%ROWCOUNT。


0
if Exists select * from Yourtable WHere Your Criteria
begin
  update ...
end
else
begin
  insert ...
end

EXISTS会锁定正在查询的主键,以至于另一个用户在此期间无法进行插入吗?如果不是这样,那么存在这样的可能性:EXISTS找不到行,但随后的INSERT失败,因为该行已经被插入(到那时为止)。我不知道隔离级别方面的答案,因此提出了我的问题。 - Kristen
Exists 也不能用于更新。假设用户更新一条记录并输入了数据库中已存在的值,则 exists 将允许用户执行不正确的更新操作。 - Abhishek Kapuria

0
这种方法会起到作用。@AlreadyExisted 可以是存储过程的输出参数,供调用代码在返回后检查。
DECLARE @AlreadyExisted BIT
SET @AlreadyExisted = 0

IF EXISTS(SELECT * FROM YourTable WHERE YourField = @FieldValue)
    BEGIN
        -- Record already exists
        SET @AlreadyExisted = 1

        UPDATE YourTable
        SET....
        WHERE YourField = @FieldValue
    END
ELSE
    BEGIN
        -- Record does not already exist
        INSERT YourTable (YourField,....) VALUES (@FieldValue,.....)
    END

谢谢您的回复。但作为一个初学者,我仍然无法让您的回复对我起作用。 - Abhishek Kapuria
让我向您解释确切的情况。我正在使用ASP.net工作,需要保持表中两列的唯一性,但不能使用唯一约束。因此,我想要这样一个过程...创建过程 usp_checkall @field1 varchar(20),@field2 varchar(20),@ID int,@cunt int output,现在您可以根据@id更新/插入@field1、@field2的查询。 - Abhishek Kapuria
我认为你需要在原始问题中添加更多细节。从未格式化的评论中无法解密。 - Aaron Bertrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接