在条件情况下插入或更新

时间:2016-11-26 13:11:53

标签: c# sql sql-server cursor insert-into

我现在面临一个问题,我想快速解决这个问题。

我已经找到了关于这个问题的另一个答案,但没有一个有帮助,我读过INSERT INTO和INSERT ON DUPLICATE KEY UPDATE,但我认为它并没有真正帮助我。

所以问题是,我启用了一些向现有表添加新列的迁移,事实是迁移之前的表上的现有记录甚至在现有列上获取具有空值的记录(因为我正在改变顺序迁移了新表上的列

我正在做一个SP,它的目的是根据插入或更新来填充迁移的新表。

  • 我想总是插入新记录,除非我在表上找到了包含空列的现有记录(列Id - 主键 - 已填充)

"伪代码" (混合sql表知识和c#语法)将是这样的:

int i = 0;
foreach(Record item in importing_data_table)
{

     if(i < tableMigrated.Length && tableMigrated[i].Column IS NULL)
     {
          UPDATE tableMigrated[i] SET Column = item.Column
     }
     else
     {
          INSERT INTO item 
     }

     i++;
}

注意:在插入之前从tableMigrated删除所有行不是可能,因为该表有外键。尝试这种方法时出现以下错误: - DELETE语句与REFERENCE约束冲突&#34; FK_blabla.Testing_testingTest.tableMigrated_Id&#34;。

NOTE2 :也许我唯一的选择是使用游标?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在您的存储过程中,使用合并声明。 Merge根据您的插入条件为INSERT提供功能,否则为UPDATE。这是一个例子

MERGE dbo.FactBuyingHabits AS Target
USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source
ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID)
WHEN MATCHED THEN
    UPDATE SET Target.LastPurchaseDate = Source.PurchaseDate
WHEN NOT MATCHED BY TARGET THEN
    INSERT (CustomerID, ProductID, LastPurchaseDate)
    VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate)

查看Technet - Inserting, Updating, and Deleting Data by Using MERGE