Sql 更新和插入存储过程

Sql 更新和插入存储过程,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我想创建一个存储过程,在下列情况下对列执行插入或更新操作 该列不包含数据库中已经存在的值,它应该允许在计数(字段)=0时插入或在计数(字段)=0或1时更新,并且我应该知道是否执行了这些操作。 请使用COUNT not Exists解决我的问题,因为这对更新不起作用 我在ASP.net中工作-我有两列表,需要在不使用唯一约束的情况下保持唯一。所以我想要一个这样的过程: create proc usp_checkall @field1 varchar(20),

我想创建一个存储过程,在下列情况下对列执行插入或更新操作 该列不包含数据库中已经存在的值,它应该允许在计数(字段)=0时插入或在计数(字段)=0或1时更新,并且我应该知道是否执行了这些操作。 请使用COUNT not Exists解决我的问题,因为这对更新不起作用

我在ASP.net中工作-我有两列表,需要在不使用唯一约束的情况下保持唯一。所以我想要一个这样的过程:

create proc usp_checkall @field1 varchar(20), 
                         @field2 varchar(20), 
                         @ID int, 
                         @count int output 

现在,根据@id更新/插入@field1和@field2的查询,这种方法就可以了@AlreadyExisted可以是存储过程上的输出参数,以便调用代码在返回后进行检查

if Exists select * from Yourtable WHere Your Criteria
begin
  update ...
end
else
begin
  insert ...
end
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
使用:

这将适用于SQL Server、MySQL、Oracle和Postgres。所需要的只是使用db适当的变量引用。IE:对于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。

如果您碰巧有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)

你已经试过什么了?是的,我说的是SQLServerExists比CountExists更适合更新。因为它将允许用户在已经存在的表中输入数据谢谢您的回复。但作为一个初学者,我仍然无法让你的回答对我有效。让我向你解释确切的情况。我在ASP.net中工作,我有一个表的tw0列,需要在不使用唯一约束的情况下保持唯一。所以我想要一个这样的程序。。创建proc usp_checkall@field1 varchar(20),@field2 varchar(20),@ID int,@cunt int现在输出您在@idI基础上更新/插入@field1,@field2的查询。我认为您需要在原始问题中添加更多细节。无法从未格式化的注释中破译。EXISTS是否会锁定正在查询的PK,以使其他用户在此期间不可能进行插入?如果没有,那么EXISTS可能找不到行,但是后续插入失败,因为该行已经插入(到那时)。我不知道关于隔离级别的答案,因此我的问题。Exists也不适用于更新。假设用户更新记录并输入数据库中已经存在的值,则exists将允许用户执行不正确的更新操作
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)