SQL 存储过程

ALTER PROCEDURE RPT_MaterialPush
	 @TimeRange nvarchar(50), -- 参数 TimeRange 时间跨度  day,week,month,quater(天,周,月,季)
	 @TimeNum int, -- 参数 TimeNum 时间跨越次数
	 @ProductIDs nvarchar(1000)-- 参数 ProductIDs 产品ID(逗号分隔)[暂时没用到]
  AS 

	BEGIN 
	--print 'begin' 
		DECLARE @StartTime Nvarchar(MAX)='',
				@EndTime Nvarchar(MAX)='',
				@str1 Nvarchar(MAX)='',
				@str2 Nvarchar(MAX)='',
				@sql Nvarchar(MAX) ='', 
				@i int=0, 
				@j int=@TimeNum ;
						 
			WHILE @i <= @j BEGIN   --while 循环 begin end 结构是必须的
  --原本想把 dateadd 之后的第一个参数做成参数化的,但是局部变量设置成 varchar 类型是不对的,然后试过datepart也不行,没办法只能写几个看似有些重复的语句
			if  (@TimeRange = 'day')
			  begin
				SET @StartTime = CONVERT(varchar(100), dateadd( dd, -@TimeNum-1, getdate()), 121)
				SET @EndTime = CONVERT(varchar(100), dateadd( dd, -@TimeNum, getdate()), 121) 
			  end
			else if (@TimeRange = 'week')
			   begin
				SET @StartTime = CONVERT(varchar(100), dateadd( wk, -@TimeNum-1, getdate()), 121)
				SET @EndTime = CONVERT(varchar(100), dateadd( wk, -@TimeNum, getdate()), 121) 
			   end
			else if (@TimeRange = 'month')
			   begin
				SET @StartTime = CONVERT(varchar(100), dateadd( mm, -@TimeNum-1, getdate()), 121)
				SET @EndTime = CONVERT(varchar(100), dateadd( mm, -@TimeNum , getdate()), 121) 
			   end
		    else if (@TimeRange = 'quater')
			   begin
				SET @StartTime = CONVERT(varchar(100), dateadd( qq, -@TimeNum-1, getdate()), 121)
				SET @EndTime = CONVERT(varchar(100), dateadd( qq, -@TimeNum, getdate()), 121) 
			   end
			--print @StartTime 
			--print @EndTime 
			--print @TimeNum
			SET @str1 += 'sum (case  when ca.Modified between '''+ @StartTime + '''and '''+ @EndTime +''' then 1 else 0 end ) as '''+ CONVERT(varchar(5), @i) + ''' ,'
			SET @TimeNum = @TimeNum - 1
			SET @i = @i + 1 
	 
				print @TimeNum 

			END  -- while循环的 end 
		 
			SET @str2 = left(@str1,len(@str1)-1) --去除str1最后的一个逗号 “ ,”
			SET @sql = 'select '+ @str2 + 'from [dbo].[Con_ArticleInfo] as ca join [dbo].[Con_EssentialsMaterial] as ce on ca.AuthorName = ce.AuthorName and ca.ArticleName = ce.ArticleName' 
			
--为什么那么长的sql语句不换行呢。。因为 nvarchar 最多 8000 字符,换行和空格都算字符,很容易就超了
             
	EXEC sp_executesql @sql 
	    print 'str1:  '+ @str1
		print 'sql:' + @sql 
END 
GO 

	EXEC RPT_MaterialPush 'day', '30',''
	EXEC RPT_MaterialPush 'week', '9',''
	EXEC RPT_MaterialPush 'month', '5',''
	EXEC RPT_MaterialPush 'quater', '4',''
 
 --数据任然在调试中,虽然这不是我写过的最复杂的sql语句,但是还是值得记一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值