生成存储过程报告的结果集问题

时间:2017-02-01 20:22:17

标签: sql sql-server-2008

我有一个基于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')

1 个答案:

答案 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年检查过程中的实际问题或查询中的实际问题。

希望有所帮助