向SQL Server中插入大量数据,判断是否重复

古兰色回忆 2011-06-29 06:25:36
我准备想数据库中插入大量数据,然后根据数据其中的两个字段(例如:title,tel)来判断,如果有一条数据的两个字段与数据库中的某条数据有重复,则把数据库中的更新时间(updatetime)进行更新。这个要怎么做?
...全文
2636 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bearfly2011 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 rogation 的回复:]

已经找到解决办法,只需要在数据库中写一个存储过程,首先执行更新操作,然后使用@@ROWCOUNT得到受影响的行数,如果行数为0,就执行插入操作。不管怎么说,还是多谢大家了。
[/Quote]

……
bearfly2011 2011-06-30
  • 打赏
  • 举报
回复
哈哈因为在你之前就已经结贴了
spring0906 2011-06-30
  • 打赏
  • 举报
回复
晕了 我的怎么一分都没有
bearfly2011 2011-06-30
  • 打赏
  • 举报
回复
如果是大量数据建议使用临时表
1)先将数据存储到临时表中
2)调用批量更新语句

CREATE TABLE Test1(A INT PRIMARY KEY, B NVARCHAR(10));
INSERT Test1
SELECT 1, '11' UNION ALL
SELECT 2, '22' UNION ALL
SELECT 3, '33';


CREATE TABLE Test2(A INT PRIMARY KEY, B NVARCHAR(10));
INSERT Test2;
SELECT 1, '111' UNION ALL
SELECT 4, '444' UNION ALL
SELECT 5, '555';

SELECT * FROM test1;
SELECT * FROM test2;

--批量更新
UPDATE test1
SET test1.b = test2.b
FROM test1 INNER JOIN test2 on test1.a = test2.a;
--批量修改
INSERT test1
SELECT test2.*
FROM test2 LEFT JOIN test1 ON test2.a = test1.a
WHERE test1.a IS null;
SELECT * FROM test1;
SELECT * FROM test2;

drop table test1;
drop table test2;


3)……
古兰色回忆 2011-06-30
  • 打赏
  • 举报
回复
已经找到解决办法,只需要在数据库中写一个存储过程,首先执行更新操作,然后使用@@ROWCOUNT得到受影响的行数,如果行数为0,就执行插入操作。不管怎么说,还是多谢大家了。
spring0906 2011-06-30
  • 打赏
  • 举报
回复
两种思路,不知道能不能帮助你:

① 就像 4 楼说的那样没插入一条数据的时候做判断,
IF (SELECT Count(1) FROM Table WHERE title='插入的值' and Name='插入的值' ')>0)
begin
update Table set datetimes="新值"
end
else
begin
insert into table values()
end
这样就必须做类似的存储过程,用变量接收单条插入的信息,然后循环插入每一条。

②既然是批量插入,那把新的数据先插入一个新表(这里可以是临时表)newTable,然后再从newTable中更新原表oldTable的数据就行了
我这里模拟字段 id,Title,ProName,CreateDate

---更新相同数据的时间
update oldTable set CreateDate=A.CreateDate from newTable A,oldTable B where B.Title=A.Title and B.ProName=A.ProName
---插入不同数据的记录
insert into oldTable(Title,ProName,CreateDate) select Title,ProName,CreateDate from newTable A where not exists(select id from oldTable where oldTable.Title= A.Title and oldTable.ProName=A.ProName)

---这里必须先执行更新 再执行插入

zhou_xuexi 2011-06-30
  • 打赏
  • 举报
回复
你可以用存储过程来做,一种方法,C#循环插,在存储过程中做判断插入还是修改,还有一种就是先查出重复的,和不重复的,然后一次性插入不重复,修改重复的,我个人认为后面一种方法的性能好一些
mathieuxiao 2011-06-30
  • 打赏
  • 举报
回复
你这题我建议不用修改表中的数据,只要保证新增记录的插入时间为当前时间就可以了(在你的表中加上一列表示插入时间),如果后面的查询需要知道最新的更新时间,你只需要按照插入时间降序排列,然后取出最大值就可以了。

之所以这样建议,lz你想想,如果在你的表中现在已经存在10条title和tel相同的记录,现在又新增了一条相同的记录,那么难道你要把前面10条记录的更新时间都改动吗?我想是不用的,你其实需要的就是最后一行记录的插入时间。说白了,最后一行记录的插入时间就是同类数据的更新时间。

如果需要知道全部的更新时间,就根据title和tel查出全部数据就可以了
dalmeeme 2011-06-30
  • 打赏
  • 举报
回复
用当前插入的数据的相应字段查询一下,select count(*) from table where title=插入的值 and tel=插入的值,如果返回大于0,说明已经存在重复;如果等于0,说明不存在重复。

用ado.net可以,也可以用sql写(这时就是返回大于1说明重复),不过sql的我不会写。
zengguoyu 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yanweijie0317 的回复:]
因为在插入前要进行对比,所以肯定用c#
[/Quote]

这种方法是不可行的,你在插入数据前,怎么知道数据库里面有重复的记录?如果你用C#在插入前比较,那是不是你在每比较一条数据的时候都进行一次数据库的查找操作、重复的连接数据库?我们知道,数据库的连接是一个重量级的操作,是非常的耗时的!就算你只连接一次,然后再这次连接中查找,那么在大量数据的情况下,疯狂的访问数据库,效率也是不可取的!


推荐使用数据库,建议写个存储过程什么的!
yanweijie0317 2011-06-29
  • 打赏
  • 举报
回复
因为在插入前要进行对比,所以肯定用c#
maozhu_yimi 2011-06-29
  • 打赏
  • 举报
回复
推荐直接用数据库,如果是大量数据的话,直接用数据库操作速度明显快很多。
fhpu168 2011-06-29
  • 打赏
  • 举报
回复
you can test "Having"

such as
select title,count (title)
from Table
group by title
having ( count(title)>1)

hhc123 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ly_longyue 的回复:]
感觉插入前 在内存中 去掉重复是不是更好点
[/Quote]
这个只能对插入前的这些数据进行对比,数据库中还有其他数据呢.
hhc123 2011-06-29
  • 打赏
  • 举报
回复
IF (SELECT Count(*) FROM Table WHERE title='@'and tle='@')
>0
应该是这样子的,数据库我比较差
程序猿CKeen 2011-06-29
  • 打赏
  • 举报
回复
一般来说能在数据库解决的比较喜欢用数据库解决
龍月 2011-06-29
  • 打赏
  • 举报
回复
感觉插入前 在内存中 去掉重复是不是更好点
古兰色回忆 2011-06-29
  • 打赏
  • 举报
回复
因为不知道到底使用SQL来做,还是C#来做,所以就发到这里了。如果有解决方案的话,明天结分。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧