首先来说,SQL没有这种自动更新的功能,如果你是保留旧的数据,忽略新插入的重复数据,不可以设置唯一约束来实现其次,你可以直接在插入代码中处理,也可以用触发器.
解决方案 »
- 数据库 字段被注如木马脚本<scripT>,请老手帮忙
- 这个要怎么做,高手请进?
- HELP!HELP!服务管理器提示无法启动!
- 在 BCB 中怎么判断已经和SQL Server连接上?在线等!
- 如何清空某字段内所有标点符号?
- sqlserver2000在登陆查询分析器的时候以“。”可以登陆,而以127.0.0.1 或 localhost无法登陆(在线等)
- 如何读取记录最大timestamp
- 怎样把一个服务器上的数据库复制到另外一个服务器上
- oracle 和SQL SERVER
- 在sqlserver中不使用向导,如何使用dts从另外数据库中传输一个表中的数据?
- 为什么这句代码是错误的?
- 两个bigint类型的值为什么不能比较大小?
--楼主可以考虑这样导数据--删除已经存在的
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万条记录左右的时间)