对sql server 一些操作方法

本文介绍了在SQL Server中处理统计数据的方法,包括创建存储过程`sp_SelectEfficiency`来查询员工工作效率,以及处理单个字段数据的存储过程`sp_ChuliTel`。此外,还涉及到触发器`trg_tblCheckedPersonInfo`的应用,用于自动检查来电信息的完整性与一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在数据库处理统计数据 刚开始是在数据库处理的,后来发现在业务层会更好些 不过还是放这以后用的着

--查询单个员工工作效率
if exists(select * from sysobjects where name='sp_SelectEfficiency')
drop proc sp_SelectEfficiency
go
create proc sp_SelectEfficiency
@CpNumber varchar(20),
@LastTime varchar(20),
@LastTime2 varchar(20)
as
begin
  select @LastTime=  convert(datetime,(convert(varchar,@LastTime)+' 00:00:00'))
  select @LastTime2=  convert(datetime,(convert(varchar,@LastTime2)+' 23:59:59'))
 declare @table table
(
 CName varchar(20),--来电姓名
 CountTime int, --来电次数
 Time2 float,  --在场时间
 Time1 float , --在途时间 
 Efficiency float --工作效率
)
 declare @xunhuan int
 select @xunhuan=count(*) from tblCheckedPersonInfo
  where 1=1
  and (CpNumber=@CpNumber or (@CpNumber is null) or len(@CpNumber)=0)
  and(LastTime between @LastTime and @LastTime2)
--  group by CpNumber
  while(@xunhuan>0)
   begin
      declare @name varchar(20) --员工姓名
      declare @Number varchar(20) --根据不同的 @xunhuan 找出其员工工号
      declare @count float  --在场时间 小时数
      declare @c int  --来电次数
      declare @countN int --在场时间 分钟数
      declare @countN2 float --工作时间
      declare @Efficiency   float --工作效率
      declare @int int
      set @int=1
     --根据不同的@xunhuan 找出对应的姓名,工号
      select @name=CpName,@Number=CpNumber
      from (
       select  CpID,CpName,CpNumber,
         (select count(*) from tblCheckedPersonInfo as e2
            where e1.CpID >= e2.CpID
            and (e2.CpNumber=@CpNumber or (@CpNumber is null) or len(@CpNumber)=0)
            and(e2.LastTime between @LastTime and @LastTime2)
          ) as rownumber
        from  tblCheckedPersonInfo as e1
         where 1=1
        and (e1.CpNumber=@CpNumber or (@CpNumber is null) or len(@CpNumber)=0)
        and(e1.LastTime between @LastTime and @LastTime2)
       ) as a
      where rownumber=@xunhuan
--首先判断这条信息是否完整 即 要有离开宾馆时间 到达工厂时间 离开工厂时间

      --根据工厂代码分组 查询在场时间和
       select @countN=sum(a.shijian) from
       (
       select FacNumber,datediff(n,min(LastTime),max(LastTime)) as shijian from tblCheckedPersonInfo
         where  1=1
        and(CpNumber=@Number)
        and(LastTime between @LastTime and @LastTime2)
        and(CheckedType='1' or CheckedType='2')
        and IsEffect='1'
        group by  FacNumber
       ) as a
      --根据 天分组 求出每天工作时间和
       select @countN2=sum(shijian) from
       (
        select datediff(n,min(LastTime),max(LastTime)) as shijian from tblCheckedPersonInfo
        where 1=1 
        and(CpNumber=@Number)
        and(LastTime between @LastTime and @LastTime2)
        and IsEffect='1'
         group by day(LastTime)
       ) as a
      --
       select @count=convert(decimal(18,2),@countN/convert(numeric(8,2),60))  --在场小时数
       select @countN2=convert(decimal(18,2),@countN2/convert(numeric(8,2),60)) --工作时间
       
       select @c=count(*) from tblCheckedPersonInfo
         where  1=1
        and(CpNumber=@Number)
        and(LastTime between @LastTime and @LastTime2)
        and IsEffect='1'              --来电次数 
       select @Efficiency=convert(decimal(18,2),(@count/(convert(numeric(8,2),(datediff(dd,@LastTime,@LastTime2)+1))))) --工作效率
     insert into @table                 --将上述结果插入到虚拟表@table中
     select CName=@name,CountTime=@c,Time2=@count,Time1=@countN2-@count,Efficiency=@Efficiency
    set @xunhuan=@xunhuan-1 --循序-1
    set @int=@int+1
   end
 select distinct CName,CountTime,Time2,Time1,Efficiency from @table
end

---------------------------------------------------------------------------------------------------

2.处理单个字段中的数据

如‘12,123,abc,ccd’

通过‘12’模糊查询后将其符合查找结果为

12

123

 

 --将电话号码 放在gridview 中模糊查询 ,
if exists(select * from sysobjects where name='sp_ChuliTel')
drop proc sp_ChuliTel
go
create proc sp_ChuliTel
@tel nvarchar(1000),
@aa varchar(1000)
as
begin
 declare @table table (tele varchar(1000)) --创建临时表
 if  charindex( ',',@tel) = 0                           --如果没有分隔符号插入数据
 begin
    insert into @table
    select @tel
 end
 while charindex( ',',@tel) > 0                     --有分隔符号 循环插入
 begin  
  insert into @table                                     --逐个插入
  select left(@tel,charindex( ',',@tel)-1)  
  set @tel = right(@tel,len(@tel) - charindex( ',',@tel))
   If charindex(',',@tel)=0 and @tel<>''       --将最后一条数据插入
     insert into @table
     select @tel 
 end  
 select tele from @table where charindex(@aa, tele)>0
end

 ------------------------------------------------------------------------------------------------

3.触发器的操作

--触发器 当来电信息有一条记录 的根据当前的CpID 插入检验员姓名 组号 工厂名称 及判断来电号码与工厂地址是否一致
go
--if exists(select * from tblCheckedPersonInfo where name='trg_tblCheckedPersonInfo')
drop TRIGGER trg_tblCheckedPersonInfo
go
CREATE TRIGGER trg_tblCheckedPersonInfo
ON tblCheckedPersonInfo
FOR INSERT
AS
  begin
 declare @CpID int
 declare @CpNumber nvarchar(50)
 declare @EmpName nvarchar(50)
 declare @EmpGroup varchar(100)
 declare @FacNumber nvarchar(100)
 declare @FacName nvarchar(100)
 declare @TeleNumber varchar(1000)
 declare @facname2  nvarchar(100)
 declare @CheckedType varchar(4)
 declare @id int
 declare @IsEffect varchar(1)
 declare @time datetime
 declare @count int
 declare @isSure varchar(10)
-- declare @ID int
    select @CpNumber=CpNumber,@FacNumber=FacNumber,@CpID=CpID,@TeleNumber=TeleNumber,@CheckedType=CheckedType,@time=LastTime,@IsEffect=IsEffect,@isSure=isSure from inserted
 select @EmpName=EmpName,@EmpGroup=EmpGroup from tblEmployeesInfo where EmpNumber=@CpNumber
 select @FacName=FacName from tblFactoryInfo where FacNumber=@FacNumber
 select @facname2=FacNumber from tblFactoryInfo where charindex(@TeleNumber, TeleNumber)>0
 --判断是否为加班
 if((datename(weekday,getdate())='星期六')  or (datename(weekday,getdate())='星期日'))
  begin
    if(charindex('A',@isSure)=0)
    begin
    update tblCheckedPersonInfo set isSure=isSure+'A' where CpID=@CpID
    end
  end
 --判断号码是否存在
 if not exists(select * from tblFactoryInfo where charindex(@TeleNumber,isFacNumber)>0)
  begin
    if(charindex('B',@isSure)=0)
    begin
    update tblCheckedPersonInfo set isSure=isSure+'B' where CpID=@CpID
    end
  end
 --判断来电号码 与工厂地址是否一致

 if(@facname2 is not null)
  begin
   if(@FacNumber<>@facname2)
   begin
--    update tblCheckedPersonInfo set isGood='0' where CpID=@CpID
    if(charindex('C',@isSure)=0)
    begin
    update tblCheckedPersonInfo set isSure=isSure+'C' where CpID=@CpID
    end    
   end
  end
 --判断来电信息 是否重复
-- select @id=CpID from tblCheckedPersonInfo
--  where CpNumber=@CpNumber
-- and FacNumber=@FacNumber
-- and TeleNumber=@TeleNumber
-- and CheckedType=@CheckedType
-- and IsEffect='1'
-- and @time<>LastTime
-- if @id>0
-- begin
--  update tblCheckedPersonInfo set IsEffect='2' where CpID=@id 
-- end

 --
 update tblCheckedPersonInfo set CpName=@EmpName,EmpGroup=@EmpGroup,FacName=@FacName where CpID=@CpID
 --将来电信息插入到tblEmpGroup中
-- select @count=count(*) from tblCheckedPersonInfo
--  where CpNumber=@CpNumber
-- and FacNumber=@FacNumber
-- and TeleNumber=@TeleNumber
-- and CheckedType=@CheckedType
-- if(@count<=1)
 if(@IsEffect='1')
   begin
      If charindex(',',@EmpGroup)=0 and @EmpGroup<>''
     begin
       insert into tblEmpGroup(CpNumber,FacNumber,EmpGroup,CheckedType,LastTime)
       select @CpNumber,@FacNumber,@EmpGroup,@CheckedType,@time
     end
    while charindex(',',@EmpGroup)>0
    begin
     insert into tblEmpGroup(CpNumber,FacNumber,EmpGroup,CheckedType,LastTime)
     select @CpNumber,@FacNumber,left(@EmpGroup,charindex( ',',@EmpGroup)-1),@CheckedType,@time
     set @EmpGroup = right(@EmpGroup,len(@EmpGroup) - charindex( ',',@EmpGroup))
       If charindex(',',@EmpGroup)=0 and @EmpGroup<>''
      begin
        insert into tblEmpGroup(CpNumber,FacNumber,EmpGroup,CheckedType,LastTime)
        select @CpNumber,@FacNumber,@EmpGroup,@CheckedType,@time
      end
    end
 --根据来电信息 判断这条记录是否有效
 
   end
--
 end

 

--去掉字符串两边的‘,’

 declare @varchar varchar(10)
 declare @str varchar(max)
 set @str=',abc,'
 select @varchar=left(@str,1)
 if @varchar=','
 select @str=right(@str,len(@str)-1)
 select @varchar=right(@str,1)
 if @varchar=','
 select @str=left(@str,len(@str)-1)
 print @str

 

 

--检索数据库中所有表字段内容

declare   @str   varchar(100) 
  set   @str='张三' 
declare   @s   varchar(8000) 
  declare   tb   cursor   local   for 
  select   s='if   exists(select   1   from   ['+b.name+']   where   ['+a.name+']   like  ''%'+@str+'%''
  print   ''所在的表及字段:   ['+b.name+'].['+a.name+']''' 
  from   syscolumns   a   join   sysobjects   b   on   a.id=b.id 
  where   b.xtype='U'   and   a.status>=0 
     and   a.xusertype   in(175,239,231,167)
  open   tb 
  fetch   next   from   tb   into   @s 
  while   @@fetch_status=0 
  begin 
  exec(@s) 
  fetch   next   from   tb   into   @s 
  end 
  close   tb 
  deallocate   tb

 

 declare @int int
exec proc_page 'birdbaseinfo','*','english_name','1=1','asc',1,5,  @int output

 

 

select top 10 * from table where 1=1

and id<(

select min(id) from (select top 10*1 id from table order by id desc) as a

)order by id desc



--oracle

select * from qyxx_qbs where 1=1
and jgdm<(
select min(jgdm) from (
       select  jgdm from qyxx_qbs
        where BZRQ between to_date('2012-04-01','yyyy-MM-dd') and to_date('2012-04-30','yyyy-MM-dd')
         and  rownum <=  10*1  order by jgdm desc
       )  a
)
and rownum <=  10
order by jgdm desc


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值