更新并插入存储过程

时间:2009-11-21 20:13:20

标签: sql sql-server tsql stored-procedures

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

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

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

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

4 个答案:

答案 0 :(得分: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 :(得分: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。所需的只是使用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。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这种方法可以解决问题。 @AlreadyExisted可以是sproc上的OUTPUT参数,供您的调用代码在返回后进行检查。

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