--楼主可以考虑这样导数据--删除已经存在的 delete a from user_Info a where exists( select * from OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions where [user_ID]=a.[user_ID])--插入数据 insert user_Info select * from OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions go
--或者写这样的触发器实现自动处理 create trigger tr_insert_user_Info on user_Info instead of insert as delete a from user_Info a where exists(select * from inserted where [user_ID]=a.[user_ID]) insert user_Info select * from inserted
to 邹建 原来SQLSEVER没有这种可以只需set on/off一下的功能呀你的这两种思路我也曾想到过,但是每次insert数据是都要exists select一下 会不会影响插入速度。 这个是我按原来思路写的存储过程 CREATE PROCEDURE Insert_data @str_a1 char(10), @str_a2 char(10)AS declare @err intinsert test (a1,a2) values (@str_a1,@str_a2) set @err=@@error if @err = 2627 begin update test set a1= @str_a1, a2 = @str_a2 where a1 = @str_a1 end GO 思路来源:前几天看你在csdn上关于错误处理想到的,不过需要将test表里的a1 设为主键,从而使得insert相同主键发生2627错误,在进行错误处理! 这样是否对插入速度有帮助呢
to 邹兄 是否我这种利用这种错误处理的方法只能用在单条数据插入,而用在批量导入execl记录是会完全扑捉不导错误,或是扑捉到了但是一次后就程序结束。好像看来真的不能使用错误处理,还是只能使用你的那重exists的处理方式,但是不会因为数据库过于巨大(>5000万)而插入的太慢了,因为客户可以接受的相应时间要5s内(指的是加入一个execl表大约有10万条记录左右的时间)
--楼主可以考虑这样导数据--删除已经存在的
delete a from user_Info a
where exists(
select * from OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
where [user_ID]=a.[user_ID])--插入数据
insert user_Info
select * from OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
go
--或者写这样的触发器实现自动处理
create trigger tr_insert_user_Info on user_Info
instead of insert
as
delete a from user_Info a
where exists(select * from inserted where [user_ID]=a.[user_ID])
insert user_Info select * from inserted
原来SQLSEVER没有这种可以只需set on/off一下的功能呀你的这两种思路我也曾想到过,但是每次insert数据是都要exists select一下
会不会影响插入速度。
这个是我按原来思路写的存储过程
CREATE PROCEDURE Insert_data
@str_a1 char(10),
@str_a2 char(10)AS
declare @err intinsert test (a1,a2) values (@str_a1,@str_a2)
set @err=@@error
if @err = 2627
begin
update test
set a1= @str_a1,
a2 = @str_a2
where a1 = @str_a1
end
GO
思路来源:前几天看你在csdn上关于错误处理想到的,不过需要将test表里的a1
设为主键,从而使得insert相同主键发生2627错误,在进行错误处理!
这样是否对插入速度有帮助呢
我是想知道这里是否用错误处理会比exists效率高?
你那种方法不是很好,记录每次用户导入的文件名,来防止用户重新导入,可以使得数据库里没有相同的记录,但是如果相同的文件名里更新里记录就不能更新数据库了。
是否我这种利用这种错误处理的方法只能用在单条数据插入,而用在批量导入execl记录是会完全扑捉不导错误,或是扑捉到了但是一次后就程序结束。好像看来真的不能使用错误处理,还是只能使用你的那重exists的处理方式,但是不会因为数据库过于巨大(>5000万)而插入的太慢了,因为客户可以接受的相应时间要5s内(指的是加入一个execl表大约有10万条记录左右的时间)