由于要写一个加班程序:
需要处理到的一个问题就是批量插入:
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)
end
if @source<>''
begin
insert @temp values(@source)
end
return
end
/*
改进型分割函数
@Expression--要拆分的字符串
@Delimiter --拆分符号
@n 要得到已拆分的返回字符串位置
*/
create FUNCTION dbo.split
(
@Expression NVARCHAR(4000), --要拆分的字符串
@Delimiter NVARCHAR(100), --拆分符号
@n INT --要得到已拆分的返回字符串位置
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @p INT
SET @p = CharIndex(@Delimiter,@Expression)
IF @p > 0
BEGIN
SET @p = @p + Len(@Delimiter) - 1
END
DECLARE @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
END
ELSE
BEGIN
BREAK
END
END
DECLARE @s NVARCHAR(1000)
IF @p = 0 AND @i = @n
BEGIN
SET @s = @Expression
END
ELSE
IF @i = @n
BEGIN
SET @s = SubString(@Expression, 1,@p - Len(@Delimiter))
END
RETURN @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]
GO
CREATE 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
end
close MyCursor1
deallocate MyCursor1
end
GO