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语句,但是还是值得记一下