使用Case语句要么插入表或更新现有行

问题描述:

可能重复:
Solutions for INSERT OR UPDATE on SQL Server
Only inserting a row if it's not already there使用Case语句要么插入表或更新现有行

我的标题几乎说明了什么,我试图做,但我会详细介绍一下。在创建存储过程时,首先检查它是否已经存在(通过比较两个参数),如果存在,它将更新行中的特定列,并且如果该行不存在,会在表格中插入一个新行。

BEGIN 
SELECT 
(
CASE WHEN [Site] = @site and Plant = @plant 
then 
UPDATE [Status] 
FROM Server_Status 
WHERE [Site] = @site 
ELSE 
Insert into Server_Status(Name, [Path], [Site], Plant, [Status]) 
Values (@name, @path, @site, @plant, @status) 
end 
) 
FROM Server_Status 
END 

是我到目前为止,但没有工作(显然)。有没有人比我有更多的SQL知识有什么建议?

-J

+2

[案例不是流控制方法](http://msdn.microsoft.com/en-us/library/ms181765.aspx)SQL Server的哪个版本? –

+1

您还需要修复您的'UPDATE'声明需要在'UPDATE MyTable的SET的形式MyField的= ...' – JonH

+0

的Microsoft SQL Server 2008 – Brandon

您可能要请看看MERGE (Transact-SQL)声明。

对目标表执行基于 的对源表的连接结果的插入,更新或删除操作。例如,您可以通过 插入,更新,或基于其他表中找到的差异在一个 表中删除的行同步两个表。

你可以这样做:

IF EXISTS(SELECT * FROM MyTable WHERE...) 
--value exists perform update 
    BEGIN 
    UPDATE... 
    END 
ELSE 
    --value doesnt exist perform insert 
    BEGIN 
    INSERT ... 
    END 

你应该先检查使用IF行的存在EXISTS声明如下:

IF EXISTS (SELECT * FROM Server_Status WHERE Site = @Site) 
BEGIN 
    -- UPDATE statement. 
END 
ELSE 
    -- INSERT statement. 
END 
+1

更新声明未正确形成。你在更新什么? – JonH

+1

我刚刚从他的SELECT中复制:)。这个想法是驱动IF EXISTS语句的用法。 – Vikdor