【问题标题】:Update table if rows already exists while inserting if row does not exists from a dataset如果行已存在则更新表,如果数据集中的行不存在则插入
【发布时间】:2017-08-04 22:58:53
【问题描述】:

我正在创建一个存储过程,我从 SELECT 语句插入到表中。该表有 4 列(例如 Col1、Col2、Col3、Col4)。 Column1 具有唯一值。 Column4 是插入行的时间戳。

我想要实现的是:-

1.) 当我在以后运行存储过程时,假设在 20032017 上,如果表中不存在 Col1,我会将行添加到表中。

2.) 如果表中已经存在 Col1,我会更新 Col2 和 Col3 的值,同时保持 Col5 的值不变。

所以假设在存储过程的第二次运行中,select 语句返回了这个数据集。 表格会这样显示, Col1 值为 7 的行被插入到表中。 Col1 值为 1、2 和 3 的行更新了 Col2 和 Col3 的值,而 Col4 保持相同的值。

可能我必须在存储过程中创建一个循环,其中处理 SELECT 语句返回的数据集中的每一行,但我是存储过程的新手,我遇到了困难。非常感谢代码示例,因此我可以更好地理解。

谢谢

【问题讨论】:

  • 尝试阅读MERGE - 听起来像你需要的。 msdn.microsoft.com/en-us/library/bb510625.aspx
  • @user2307236 需要澄清的几点: (1) 在第 2 步中,我假设您指的是 Col4,而不是 Col5。 (2) 在您的演练中,您有一个 ID 为 {1,2,3,7} 的表已经存在,但您说您想插入 {7}。您不是说要更新 7 吗? (3) 第三张桌子是怎么回事?它从哪里来的?为什么大多数日期都改变了?
  • @Mike 使用 MERGE 解决。谢谢

标签: sql sql-server tsql stored-procedures


【解决方案1】:

我不确定从选择中将数据插入表中是什么意思 - 合并需要源表,您可以从中更新/插入/删除目标。

如果有帮助,请尝试关注

      MERGE tabelName WITH (HOLDLOCK) AS target
    USING (SELECT Column1, Column2,Column3,Column4) AS source (Column1, Column2,Column3,Column4)  // here goes your source 
    ON (target.Column1 = source.Column1)  
    WHEN MATCHED THEN   
        UPDATE SET Column2  = source.Column2, Column3 =source.Column3
WHEN NOT MATCHED THEN  
    INSERT ( Column1, Column2,Column3,Column4)  
    VALUES ( source.Column1, source.Column2,source.Column3,source.Column4)  ;

【讨论】:

  • 感谢您的回复。 'INSERTING DATA INTO TABLE FROM SELECT' 我的意思是源表是一个表中的 SELECT 语句。
  • 使用 MERGE 解决。谢谢
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多