一尘不染

在SQL Server精简版上执行插入或更新(向上更新)

sql

我有一个使用sqlserver精简版和实体框架进行数据访问的c#项目。我需要向数据库插入或更新大量行(5000+或更多),因此,如果键存在,请更新记录(如果未插入)。我找不到紧凑型版本和EF做到这一点的方法,而没有糟糕的性能,即在一台核心i7计算机上花了2分钟以上的时间。我尝试搜索记录以查看它是否存在,然后插入(如果不存在)或更新(如果存在),搜索是该记录上的杀手kill。我曾尝试编译搜索查询,但这仅带来了很小的改进。我尝试过的另一件事是将记录插入try捕获中,如果更新失败,但这迫使我保存每条记录上的更改以获取异常,而不是在最后导致性能下降。显然我可以
不要使用存储过程,因为它是精简版。我也看过只是以某种方式直接在db上执行t-
sql,但是紧凑的流程语句似乎可以排除这种情况。我已经遍历整个世界。如果我可以过分表达部署优势和防止用户深入数据库的能力,我真的想使用紧凑型。任何建议,将不胜感激。

谢谢


阅读 232

收藏
2021-03-10

共1个答案

一尘不染

也许您可以通过使用简单的查询来获得想要的结果。假设您要插入或更新的表是这样的

TABLE original
     id integer,
     value char(100)

首先,您可以使用新值创建一个临时表(可以使用SELECT INTO或其他方式创建表)

TABLE temp
    id integer,
    value char(100)

现在,您需要做两件事,更新原始行,然后插入新值

UPDATE original 
SET original.value = temp.value
FROM original, temp
WHERE original.id = temp.id

INSERT INTO original 
SELECT * from temp 
WHERE temp.id not IN (select o.id from original o)
2021-03-10