2016-07-25 32 views
0

假设有在数据库中的一些记录是这样的:检测一个新的记录是相同的数据库中的现有记录

Id v1 v2 v3
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

而且假设我的新记录如下所示:
Id v1 v2 v3
1 1 2 1
5 5 5 5

现在,我想插入我的新记录这样:
1.检查如果ID存在于数据库中;
2.如果不存在,直接插入记录;
3.如果存在,则检测记录是否与新记录相同。如果不是,只更新更改的值。

由于我的真实数据非常大,包含50多个变量,我想快速插入,所以我想问一下有没有什么通用的方法来检测同一个Id的新记录是否与现有记录不同实体框架。我无法做50+ if查看哪些变量已被更改。

请确保您的解决方案适用于大型数据集,谢谢。

+0

的可能的复制[SQL服务器插入,如果不存在(HTTP:/ /stackoverflow.com/questions/20971680/sql-server-insert-if-not-exist) – Danieboy

+2

如果ID已经存在,为什么你需要检查是否有50个字段是不同的?你有一个特定的性能问题,还是你只是过早优化? –

+0

我正要问同样的问题。 – AVK

回答

0

可以使用MERGE执行 “更新插入” 操作:

MERGE INTO #t AS TGT 
USING (VALUES 
    (1,1,2,1), 
    (5,5,5,5)) AS SRC (Id, v1, v2, v3) 
ON TGT.Id = SRC.Id 
WHEN MATCHED THEN 
    UPDATE SET TGT.v1 = SRC.v1, 
       TGT.v2 = SRC.v2, 
       TGT.v3 = SRC.v3 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (Id, v1, v2, v3) 
    VALUES (SRC.Id, 
      SRC.v1, 
      SRC.v2, 
      SRC.v3); 

Working example

BOL:https://msdn.microsoft.com/en-us/library/bb510625.aspx

+0

谢谢克里斯。我发现'IDbSetExtensions.AddOrUpdate'方法在Entity Framework中的功能与MERGE相同 – zhichi

相关问题