我是通过select count(*) from Depro where comcode=‘***'判断是否存在
select * 似乎是最耗时的方式,换成select 主键 会好一些。
不能用主键,主键是ID,自增长的,传来的数据中不包含ID
你说的是这样??select ID from table where strname="***"
select count(ID) from table where strname="***"这样比较好
估计已经让ID做主键了吧,那就在strname上加一个非聚集索引(唯一) set nocount on select count(0) from table where strname = '***'其实,既然strname已经不允许重复了,个人感觉ID完全可以不必存在,直接拿strname做主键,除非刻意的为了保持某种兼容性。
数据库层面有个merge的方法可以考虑试试
MERGE 修改表 AS Target USING 数据表 as Source ON Target.UserName=Source.UserName WHEN MATCHED THEN UPDATE SET Target.UserAge=Source.UserAge ,Target.UpdateTime=getdate() WHEN NOT MATCHED BY Target THEN INSERT (UserName,UserAge,UpdateTime) VALUES(Source.UserName,Source.UserAge,getdate());
然后把不存在的都放在内存里,做批量插入。
不能用主键,主键是ID,自增长的,传来的数据中不包含ID
你说的是这样??select ID from table where strname="***"
set nocount on
select count(0) from table where strname = '***'其实,既然strname已经不允许重复了,个人感觉ID完全可以不必存在,直接拿strname做主键,除非刻意的为了保持某种兼容性。
USING 数据表 as Source
ON Target.UserName=Source.UserName
WHEN MATCHED THEN UPDATE
SET Target.UserAge=Source.UserAge
,Target.UpdateTime=getdate()
WHEN NOT MATCHED BY Target THEN
INSERT (UserName,UserAge,UpdateTime)
VALUES(Source.UserName,Source.UserAge,getdate());
用count(*)速度很慢 任何时候最好都不要把*列出来 上面这句你可以这样写
select 1 from Depro where comcode =‘***'
如果要判断,估计还是得拼SQL语句(千万不要用SqlParameter),简单日志的话,每秒2000以上算是可以了。不过你这个数据比较简单,应该会高于2000
关键是全部加载的数据量有多大
set statistics IO ON
select count(*) from dbo.RequestUserInfo(1 行受影响)
表 'RequestUserInfo'。扫描计数 3,逻辑读取 8780 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。set statistics IO ON
select count(ID) from dbo.RequestUserInfo(1 行受影响)
表 'RequestUserInfo'。扫描计数 3,逻辑读取 8780 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
只管插入记录,有索引重复自然就会抛出异常,catch一下就OK了