我有一个基于Visual Studio的存储过程,可以为每月审计过程生成一个报告。在被查询的数据库中,每个月的所有数据都存在于其各自的表中(Contacts_month_1,Contacts_month_2等)
此报告生成中使用的SQL包含一些次要逻辑,以允许它动态工作,而不是使用硬编码日期。问题出现在2017年1月初,当时我开始收到的不仅仅是上个月的结果,还有上一年的结果。具体而言,2016年12月的审计报告包括12/2016和2015年12月的数据。最初我认为这是一种基于今年年初的某种侥幸,我们还没有在转折期间进行过这种自动化过程。不幸的是,当我今天进入办公室时,在2017年1月的输出文件中,我也收到了2016年1月的结果。
我试图在流程中包含年份检查,但是我仍然得到相同的结果输出。任何想法都将不胜感激。
Declare @GetMonth TinyInt
,@SessionTable varchar(50)
,@ContactTable varchar(50)
,@TableVersion varchar(2)
Declare @GetYear SmallInt
,@SessionTable_year varchar(50)
,@ContactTable_year varchar(50)
,@TableVersion_year varchar(4)
Set @GetMonth=MONTH(cast(GetDate() as Datetime))-1
Set @GetYear=YEAR(cast(GetDate() as Datetime))
If (@getmonth=0) Set @GetMonth=12 + (@GetYear-1)
Set @TableVersion=CAST(@getMonth as varchar(2))
Set @SessionTable='[CentralDWH].[dbo].[Sessions_month_' +@tableversion +']'
Set @ContactTable ='[CentralDWH].[dbo].[Contacts_month_' +@tableversion +']'
-- Select @GetMonth,@GetYear (DEBUGGING STATEMENT)
-- Select @SessionTable,@ContactTable (DEBUGGING STATEMENT)
Exec('SELECT [PBX_id] as AgentID
,[p22_value] as Skill
,''Athens'' as Location
,Convert(varchar(20),c.[local_start_time],120) as local_start_time
,convert(varchar(20),c.[local_end_time],120) as local_end_time
,U.[USER_NAME]
,call_id
FROM '+@SessionTable +' S
Inner join dbo.Users U on S.user_key=U.user_key
inner Join '+ @ContactTable+' C on S.contact_key=C.contact_key
Where is_screen > 0
And Unit_Num between 398003 and 398005
and P22_value is not null
and c.[local_start_time] > ' + @GetYear
+ ' order by local_start_time')
答案 0 :(得分:0)
据我了解,@GetMonth
变量用于返回上个月
Set @GetMonth = MONTH(CAST(GetDate() AS Datetime)) - 1
快速查看程序之后我的第一个问题是这行代码:
IF (@getmonth = 0)
SET @GetMonth = 12 + (@GetYear - 1)
我不明白你为什么要将@GetMonth
变量设置为12 +当前年-1,我认为这是导致问题的原因。
当前月份为1(1月)时,您是否想要获得上一年的第12个月?如果是,那么您可以轻松地将If块更改为
If @GetMonth = 0
Begin
Set @GetMonth = 12
Set @GetYear = @GetYear - 1
End
其他问题:
建议保持变量@GetMonth
,@getmonth
名称的一致性,如果数据库归类区分大小写,这将导致错误。
@GetMonth
被声明为TinyInt
,如果您尝试存储年份,这将导致算术溢出
我建议您使用一些硬编码值测试您在此处撰写的动态SQL语句以检查返回的结果,您可以使用1月和2016年检查过程中的实际问题或查询中的实际问题。
希望有所帮助