由於要寫乙個加班程式:
需要處理到的乙個問題就是批量插入:
listbox的專案插入到資料庫
方法一:迴圈呼叫儲存過程
方法二:一次性傳入引數到儲存過程,儲存過程中游標處理
方法二的方案效率比較高:
但需要解決的乙個問題是:如何分割函式
多層分隔函式
工號1-名字1,工號2-名字2,。。。。。
實現迴圈插入資料庫:
/*分割函式的處理過程
輸入引數:
@source需要處理的字串
@@separte分割字元
*/create function str_split(@source varchar(8000),@separte varchar(10))
returns @temp table(f1 varchar(100))
as begin
declare @i int
set @source=rtrim(ltrim(@source))
set @i=charindex(@separte,@source)
while @i>=1
begin
insert @temp values(left(@source,@i-1))
set @source=substring(@source,@i+1,len(@source)-@i)
set @i=charindex(@separte,@source)
endif @source<>''
begin
insert @temp values(@source)
endreturn
end/*
改進型分割函式
@expression--要拆分的字串
@delimiter --拆分符號
@n 要得到已拆分的返回字串位置
*/create function dbo.split
(@expression nvarchar(4000), --要拆分的字串
@delimiter nvarchar(100), --拆分符號
@n int --要得到已拆分的返回字串位置
)returns nvarchar(4000)
asbegin
declare @p int
set @p = charindex(@delimiter,@expression)
if @p > 0
begin
set @p = @p + len(@delimiter) - 1
enddeclare @i int
set @i = 1
while @i < @n
begin
set @i = @i + 1
set @expression = substring(@expression, @p + 1,len(@expression) - @p )
set @p = charindex(@delimiter,@expression)
if @p > 0
begin
set @p = @p + len(@delimiter) - 1
endelse
begin
break
endend
declare @s nvarchar(1000)
if @p = 0 and @i = @n
begin
set @s = @expression
endelse
if @i = @n
begin
set @s = substring(@expression, 1,@p - len(@delimiter))
endreturn @s
end新建資料庫的表:
if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[overtime]') and objectproperty(id, n'isusertable') = 1)
drop table [dbo].[overtime]
gocreate table [dbo].[overtime] (
[taskid] [char] (10) collate chinese_prc_ci_as null ,
[personno] [varchar] (20) collate chinese_prc_ci_as null ,
[personname] [char] (10) collate chinese_prc_ci_as null ,
[overtime] [decimal](18, 2) null ,
[taskdate] [datetime] null ,
[reasonref] [varchar] (40) collate chinese_prc_ci_as null ,
[id] [int] identity (1, 1) not null
) on [primary]
go儲存過程的處理方式:
create procedure uf_web_overtime(
@source varchar(8000),
@separte varchar(1),
@tmp_id_name varchar(50),
@taskid varchar(20),
@personno varchar(50),
@personname varchar(20),
@overtime int,
@taskdate datetime,
@reasonref varchar(50) )as
begin
declare mycursor1 cursor
local static for select f1 from str_split(@source,@separte)
open mycursor1
while 1=1
begin
fetch mycursor1 into
@tmp_id_name
if @@fetch_status<>0
break
if @tmp_id_name is not null
begin
set @personno=dbo.split(@tmp_id_name,'-',1)
set @personname=dbo.split(@tmp_id_name,'-',2)
insert overtime(taskid,personno,personname,overtime,taskdate,reasonref)values(@taskid,@personno,@personname,@overtime,@taskdate,@reasonref)
end
endclose mycursor1
deallocate mycursor1
end
go
jdbcTemplate批量插入處理資料
最近有個需求,就是批量處理資料,但是併發量應該很大,當時第一時間想到得是mybatis的foreach去處理,但是後來通過查資料發現,相對有spring 的jdbctemplate處理速度,mybatis還是有些慢,後來就自己重寫了一下jdbctemplate的批量處理 public void ba...
Oracle資料的批量插入
前兩天接到乙個需求 需要程式設計將sql server中的資料插入至oracle。資料大約有20多萬條記錄。開始的時候我採取了直接構建sql插入的方式,結果耗時太長。為了提高效能我上網找了資料。最終採用dataadapter批量插入至oracle,提高了效能。如下 一,直接構建sql語句插入 vb....
表資料的批量插入
當乙個表要插入資料庫時,手動編寫sql插入語句是不太現實的,效率也比較低。我用的是sqlbulkcopy view code public void executetransactionscopeinsertex datatable dt,string tablename sbc.writetose...