我想创建一个存储过程,对列执行插入或更新操作 该列不包含数据库中已存在的值,它应允许在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
答案 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