导入一个excel到mssql的问题

hztltgg 2012-04-25 12:56:21
要导入一个用户表,字段不多,就一个ID和一个Name,
mssql里还有一个Password是密码,密码是MD5加密的,是在导入到过程中通过c#代码转换,默认的密码就是用户id,所以每个不同,不能事先生成好。
要求是如果mssql里已经有这个id的用户了,就不能导了,已防把已经修改过的密码又覆盖了。

应该如何做比较合理?一个个查看是不是已经存在,然后导入似乎效率太低,是先导入临时表,然后再关联,找出原数据库没有的记录,一次性导入吗?大致的代码如何写?谢谢
...全文
139 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
anzhiqiang_touzi 2012-04-26
  • 打赏
  • 举报
回复
还有一种方式:

生成insert脚本导入,

脚本太大则分批执行

if(not exists(select UserID from UserInfo where UserID='U0001'))
INsert INTO UserInfo....
if(not exists(select UserID from UserInfo where UserID='U0002'))
INsert INTO UserInfo....
anzhiqiang_touzi 2012-04-26
  • 打赏
  • 举报
回复
办法:
还是老办法。
导入一个插入一个
你的用户id是有索引的,查新一个应该不慢
另外就是你的查询操作和插入需要放在一个数据连接里面,避免开,闭数据库影响性能,。至于开不开事物,看你的要求了。
如果还是觉得慢的话,把你的数据分为多个线程来做,分线程的话,就不要开事物了,因为开事物会把表锁住

锁住表的话,和单线程执行没区别的
hztltgg 2012-04-26
  • 打赏
  • 举报
回复
决定用
Insert into dbo.TestUser select 1, 'UserName1' where not exists(select 1 from TestUser where ID=1)
方式来循环实现。
anzhiqiang_touzi 2012-04-26
  • 打赏
  • 举报
回复
关键是他是从excel导入的

也就是说:还是要用c#插入数据,没办法批量插入

最终逃不过

Insert into #TestUser select @i, 'UserName1'
anzhiqiang_touzi 2012-04-26
  • 打赏
  • 举报
回复
经过反复测试10000条数据

临时表耗时:6-7秒

生成SQL直接插入耗时:3-4秒
EnForGrass 2012-04-26
  • 打赏
  • 举报
回复

-------------临时接插入耗时测试
declare @i int
set @i=0
--创建临时表
select 0 ID, 'UserName1' UserName into #TestUser where 1=2
--插入到临时表
while(@i<10000)
begin
Insert into #TestUser select @i, 'UserName1'
set @i=@i+1
end
--从临时表插入到正式表
insert TestUser(ID,UserName) select * from #TestUser where not exists(select 1 from TestUser where ID=#TestUser.ID)
drop table #TestUser
--(耗时:14秒)

你这个就是一条一条插入的所以慢,直接批量插入就会快一点
anzhiqiang_touzi 2012-04-26
  • 打赏
  • 举报
回复
好奇,刚才做了个测试


---创建表
CREATE TABLE [dbo].[TestUser](
[ID] [int] NOT NULL,
[UserName] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_TestUser] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO



-------------临时接插入耗时测试
declare @i int
set @i=0
--创建临时表
select 0 ID, 'UserName1' UserName into #TestUser where 1=2
--插入到临时表
while(@i<10000)
begin
Insert into #TestUser select @i, 'UserName1'
set @i=@i+1
end
--从临时表插入到正式表
insert TestUser(ID,UserName) select * from #TestUser where not exists(select 1 from TestUser where ID=#TestUser.ID)
drop table #TestUser
--(耗时:14秒)



--直接插入耗时测试
declare @j int
set @j=0
while(@j<10000)
begin
Insert into dbo.TestUser select @j, 'UserName1' where not exists(select 1 from TestUser where ID=@j)
set @j=@j+1
end
--(耗时:4秒)

--如果是第二次插入重复的数据时,用临时表更慢

EnForGrass 2012-04-26
  • 打赏
  • 举报
回复
excel导入到临时表 然后再去掉重复的(如果是一条一条的导入那速度肯定就会慢一些)

然后从临时表中判断插入正式表,例如:
insert tb(tid,name) select distinct * from # temp
where not exists(select * from tb where tid=temp.tid)
段传涛 2012-04-26
  • 打赏
  • 举报
回复
是先导入临时表,然后再关联
----------------------------
想想你的资源开销 不比你判断一下再写入的少。
段传涛 2012-04-26
  • 打赏
  • 举报
回复
我觉的读到 dataset 再用循环方式写入 比较好,反正你是要进行判断的。
anzhiqiang_touzi 2012-04-26
  • 打赏
  • 举报
回复
刚趴下还没睡着,有想了个方式

这个方式和前面的有个方式差不多




还是产生sql语句

--创建表
CREATE TABLE [dbo].[TestUser](
[ID] [int] NOT NULL,
[UserName] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_TestUser] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO

--插入语句(不重复测试)
Insert into dbo.TestUser select 1, 'UserName1' where not exists(select 1 from TestUser where ID=1)
Insert into dbo.TestUser select 2, 'UserName2' where not exists(select 1 from TestUser where ID=2)
Insert into dbo.TestUser select 3, 'UserName3' where not exists(select 1 from TestUser where ID=3)
Insert into dbo.TestUser select 4, 'UserName4' where not exists(select 1 from TestUser where ID=4)
Insert into dbo.TestUser select 5, 'UserName5' where not exists(select 1 from TestUser where ID=5)


--插入语句(重复测试)
Insert into dbo.TestUser select 1, 'UserName1' where not exists(select 1 from TestUser where ID=1)
Insert into dbo.TestUser select 2, 'UserName2' where not exists(select 1 from TestUser where ID=2)
Insert into dbo.TestUser select 3, 'UserName3' where not exists(select 1 from TestUser where ID=3)
Insert into dbo.TestUser select 4, 'UserName4' where not exists(select 1 from TestUser where ID=4)
Insert into dbo.TestUser select 5, 'UserName5' where not exists(select 1 from TestUser where ID=5)

q107770540 2012-04-26
  • 打赏
  • 举报
回复
可一次性导入,导入前添加一临时字段标记一下导入来源,后期好作处理
出现问题也可快速找出导入的数据并直接删除
anzhiqiang_touzi 2012-04-26
  • 打赏
  • 举报
回复
另外还有一种方式:

生成insert脚本文件,用代码执行cmd,然后在cmd执行sql导入

脚本还是这个
if(not exists(select UserID from UserInfo where UserID='U0001'))
INsert INTO UserInfo....
if(not exists(select UserID from UserInfo where UserID='U0002'))
INsert INTO UserInfo....

这个方法的问题就是你的iis服务器和sql 服务可能需要在已个机器上

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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