none
存储过程的外部参数如何传入多个值 RRS feed

  • 问题

  • 做了一个考勤数据随机生成软件,想把礼拜六和礼拜天的日期排除在外。如何把这一组日期传递给存储过程的@date参数。并在存储过程内部遍历。
    2011年4月21日 4:41

答案

  • 你好!
    把一组星期六和星期天的日期作为参数传入存储过程,那么要将这个参数定义为字符类型,可以用逗号隔开。然后自定义一个函数去分割这个字符,返回结果是一个数据库表格。把字段由字符类型转换成日期类型就可以了。
    --分割字符串函数
    
    CREATE FUNCTION [dbo].[GetCommaSplitValue](@String varchar(8000), @Delimiter char(1))    
     returns @temptable TABLE (items varchar(8000))    
    as    
    begin    
      declare @idx int    
      declare @slice varchar(8000)    
        
      select @idx = 1    
        if len(@String)<1 or @String is null return    
        
      while @idx!= 0    
      begin    
        set @idx = charindex(@Delimiter,@String)    
        if @idx!=0    
          set @slice = left(@String,@idx - 1)    
        else    
          set @slice = @String    
          
        if(len(@slice)>0)  
          insert into @temptable(Items) values(@slice)    
     
        set @String = right(@String,len(@String) - @idx)    
        if len(@String) = 0 break    
      end  
    return    
    end
     GO
    
    --测试
    declare @a varchar(20)
    set @a='2011-01-01,2011-02-01'
    select * from [GetCommaSplitValue](@a, ',')

    但是参数的长度是有限制的,你传入的日期如果很多的话,这种实现方式不是很理想。你可以判断当前日期是否为星期六或者星期天,如果是,就排除:
    select case when datename(weekday,GETDATE()) in ('Saturday','Sunday') then 1 else 0 end
    
     

    Best Regards,
    Stephanie Lv

    • 已标记为答案 Ai-hua Qiu 2011年4月29日 8:15
    2011年4月22日 9:08

全部回复

  • 你好!
    把一组星期六和星期天的日期作为参数传入存储过程,那么要将这个参数定义为字符类型,可以用逗号隔开。然后自定义一个函数去分割这个字符,返回结果是一个数据库表格。把字段由字符类型转换成日期类型就可以了。
    --分割字符串函数
    
    CREATE FUNCTION [dbo].[GetCommaSplitValue](@String varchar(8000), @Delimiter char(1))    
     returns @temptable TABLE (items varchar(8000))    
    as    
    begin    
      declare @idx int    
      declare @slice varchar(8000)    
        
      select @idx = 1    
        if len(@String)<1 or @String is null return    
        
      while @idx!= 0    
      begin    
        set @idx = charindex(@Delimiter,@String)    
        if @idx!=0    
          set @slice = left(@String,@idx - 1)    
        else    
          set @slice = @String    
          
        if(len(@slice)>0)  
          insert into @temptable(Items) values(@slice)    
     
        set @String = right(@String,len(@String) - @idx)    
        if len(@String) = 0 break    
      end  
    return    
    end
     GO
    
    --测试
    declare @a varchar(20)
    set @a='2011-01-01,2011-02-01'
    select * from [GetCommaSplitValue](@a, ',')

    但是参数的长度是有限制的,你传入的日期如果很多的话,这种实现方式不是很理想。你可以判断当前日期是否为星期六或者星期天,如果是,就排除:
    select case when datename(weekday,GETDATE()) in ('Saturday','Sunday') then 1 else 0 end
    
     

    Best Regards,
    Stephanie Lv

    • 已标记为答案 Ai-hua Qiu 2011年4月29日 8:15
    2011年4月22日 9:08
  • 应该建立一个日期表列表,再连接查询判断
    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    2011年4月25日 1:41
  • 把时间拼成字符串,得到参数后分割一下

    /*按照符号分割字符串*/
    create function [dbo].[m_split2](@c varchar(2000),@split varchar(2))  
     returns @t table(col varchar(200))  
     as  
      begin  
       while(charindex(@split,@c)<>0)  
        begin  
        	if(substring(@c,1,charindex(@split,@c)-1)!=' ')
        	begin
         insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))  
          end
           set @c = stuff(@c,1,charindex(@split,@c),'') 
          -- SET @c = substring(@c,charindex(' ',@c)+1,len(@c))   
        end  
        if(@c!=' ' and @c is not null and @c!='')
        begin
       insert @t(col) values (@c) 
       end 
       return  
    end
    
    2011年4月27日 2:17
    版主