【问题标题】:Using Case statement to either Insert into a table or Update an existing row [duplicate]使用 Case 语句插入表或更新现有行 [重复]
【发布时间】:2012-09-17 06:20:46
【问题描述】:

可能重复:
Solutions for INSERT OR UPDATE on SQL Server
Only inserting a row if it's not already there

我的标题几乎解释了我想要做的事情,但我会更详细地介绍。我正在创建一个存储过程,在调用它时首先检查该行是否已经存在(通过比较两个参数),如果存在,它将更新该行中的特定列,如果该行不存在它将在表中插入一个新行。

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

【问题讨论】:

  • Case is not a control-of-flow method SQL Server 是什么版本?
  • 您还需要修正您的UPDATE 语句需要采用UPDATE MyTable SET MyField=... 的形式
  • SQL Server 2008/SSMS,感谢其他线程也看马丁

标签: sql sql-server-2008 tsql insert


【解决方案1】:

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

基于目标表执行插入、更新或删除操作 关于与源表连接的结果。例如,您可以 通过在一个表中插入、更新或删除行来同步两个表 基于在另一个表中发现的差异的表。

【讨论】:

    【解决方案2】:

    您应该首先使用 IF EXISTS 语句检查该行是否存在,如下所示:

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

    【讨论】:

    • 更新语句的格式不正确。你在更新什么?
    • 我刚刚从他的 SELECT 中复制 :)。这个想法是推动 IF EXISTS 语句的使用。
    【解决方案3】:

    你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-25
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多