2016-11-26 75 views
1

我目前面临一个问题,我想为此提供一个快速解决方案。在条件允许的情况下插入或更新

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

因此,事情是,我已经启用了一些Migrations,为现有表添加新列,事情是迁移之前表上的现有记录即使在现有列上也获得空值的记录(因为我正在更改订单新表上的列被移植)

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

  • 我要永远插入新记录,除非我发现现有记录与空列的表的情况下(列ID - 主键 - 充满)

“伪代码” (混合SQL表的知识和C#语法)会是这样的:从tableMigrated删除所有行前:

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++; 
} 

注意插入不是可能,因为该表有外键。尝试该方法时出现以下错误: - DELETE语句与REFERENCE约束“FK_blabla.Testing_testingTest.tableMigrated_Id”冲突。

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

非常感谢您的帮助!

+1

我知道有人要问这个问题。我本周为自己解决了这个问题。更新返回一个整数,表示受影响的行数。所以如果更新返回零,然后我插入数据。如果主键值已经存在于数据库中,则无法插入。所以首先尝试更新,如果它返回零行受影响,然后使用插入。 – jdweng

回答

1

在您的存储过程中,使用合并声明。合并根据插入条件为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

+0

感谢您的回答,我收到了一个错误,找不到问题,有时候SQL只是让我疯狂的上帝该死的......大多数时间显示的错误根本没有帮助!这是我目前的代码,http://pastebin.com/R0uByLqv – TiagoM

+0

Finnaly得到它的工作,似乎我真的需要使用“目标”作为合并报表(第一行)的最后一句话,我很难说它可能是任何目标数据库的别名,现在看起来=/ – TiagoM

+0

其实我可以使用单词“目标”与表的任何别名,我的问题是一个替换所有也改变了“什么时候不匹配目标然后”,“当不匹配由MYTABLEALIAS THEN“,将MYTABLEALIAS改为TARGET它开始工作完美,非常感谢你的答案! :) – TiagoM

相关问题