批量插入資料的處理 分割函式的引用

2021-08-22 20:13:37 字數 3457 閱讀 5036

由於要寫乙個加班程式:

需要處理到的乙個問題就是批量插入:

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...