存储过程优化
CREATE PROC Cqrcrjhz
@month int,
@year int ,
@Dz_id int
AS
declare @day int ,@dayCur int
declare @CurString nvarchar(4000)
declare @cur_id int
declare @tempflag nvarchar(200)
if (@Dz_id!=-1)
begin
set @tempflag='where kqUserInfo.user_dz_id ='+cast(@Dz_id as varchar(2))
end
else
begin
set @tempflag=''
end
SELECT @day=DATEPART(dd,DATEADD(m,1,CAST(STR(@month) + '/01/' + STR(@year) as
datetime)) - 1)
set @dayCur=1
set @CurString='select user_id as 编号 ,user_Name as 姓名, userdept.dz_name as 单位,'
set @CurString=@CurString+''''''+'as 工种'+','''' as 出勤,'
while(@dayCur<=@day)
begin
Set @CurString=@CurString+'dbo.Kqsumbyday('+cast(@year as varchar(4))+','+cast(@month as varchar(2))+','+cast(@dayCur as varchar(2))+','+'user_id) as '''+Cast(@dayCur as varchar(2))+''','
set @dayCur=@dayCur+1
end
set @CurString=substring(@CurString,1,len(@CurString)-1)
set @CurString=@CurString+', (select count(kq_Cur_Id) from KqInfoList where datepart (yyyy,kq_date)='+cast(@year as varchar(4))+' and kq_id=kqUserInfo.user_id and datepart (mm,kq_date)='+cast(@month as varchar(2))+') as 合计'
set @CurString=@CurString+', (select count(kq_Cur_Id) from KqInfoList where datepart (yyyy,kq_date)='+cast(@year as varchar(4))+' and kq_id=kqUserInfo.user_id and datepart (mm,kq_date)='+cast(@month as varchar(2))+'and kq_bc=1) as 夜'
set @CurString=@CurString+', (select count(kq_Cur_Id) from KqInfoList where datepart (yyyy,kq_date)='+cast(@year as varchar(4))+' and kq_id=kqUserInfo.user_id and datepart (mm,kq_date)='+cast(@month as varchar(2))+'and kq_bc=2) as 早'
set @CurString=@CurString+', (select count(kq_Cur_Id) from KqInfoList where datepart (yyyy,kq_date)='+cast(@year as varchar(4))+' and kq_id=kqUserInfo.user_id and datepart (mm,kq_date)='+cast(@month as varchar(2))+'and kq_bc=3) as 中'
set @CurString=@CurString+',''''as 差,'''' as 伤,''''as 休,''''as 事,''''as 旷,'''' as 其他 '
set @CurString=@CurString+' from kqUserInfo inner join userdept on userdept.dz_id=kqUserInfo.user_dz_id '+@tempflag+' order by user_dz_id ,user_id '
print @CurString
exec(@CurString)
GO
调用的函数
CREATE FUNCTION dbo.Kqsumbyday(@year int ,@month int ,@day int , @user_id int )
RETURNS nvarchar(3000)
AS
BEGIN
declare @sumstr nvarchar(3000)
set @sumstr=' '
select @sumstr=@sumstr+case when @sumstr<>'' then ',' else '' end+ substring (bc_Name,1,1) from KqInfoList a
inner join bcInfo b on a. kq_bc=b.bc_id
where
datepart (yyyy,kq_date)=@year and datepart (mm,kq_date)=@month and datepart (dd,kq_date)=@day
and kq_id=@user_id
return(@sumstr)
END
调用的表 KqInfoList 有 2W数据
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KqInfoList]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[KqInfoList]
GO
CREATE TABLE [dbo].[KqInfoList] (
[Kq_Cur_id] [int] IDENTITY (1, 1) NOT NULL ,
[Kq_id] [int] NULL ,
[Kq_Date] [datetime] NULL ,
[Kq_Bc] [int] NULL ,
[Kq_Dz] [int] NULL ,
[Kq_Cur_Date] [datetime] NULL ,
[KQ_Flag] [int] NULL ,
[Kq_DeptChild_id] [int] NULL ,
[KQ_Remark] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
[KQ_User] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
有700 左右数据
表KqUserInfo
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KqUserInfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[KqUserInfo]
GO
CREATE TABLE [dbo].[KqUserInfo] (
[User_ID] [int] IDENTITY (1, 1) NOT NULL ,
[Dept_Child_Id] [int] NULL ,
[User_Name] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[User_Dz_id] [int] NULL ,
[User_X] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
表 UserDept
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserDept]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[UserDept]
GO
20 条数据
CREATE TABLE [dbo].[UserDept] (
[Dz_id] [int] IDENTITY (1, 1) NOT NULL ,
[Dz_Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Flag] [int] NULL
) ON [PRIMARY]
GO
存储过程执行一次大概要40S左右。。。。
谢谢大家。。