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

Sql 存储过程报告生成的结果集出现问题,sql,sql-server-2008,Sql,Sql Server 2008,我有一个基于VisualStudio的存储过程,它为每月的审核过程生成报告。在被查询的数据库中,每个月的所有数据都保存在各自的表中(Contacts\u month\u 1、Contacts\u month\u 2等) 此报告生成中使用的SQL包含一些次要逻辑,以允许它动态工作,而不是使用硬编码日期。问题出现在2017年1月初,当时我不仅开始收到上个月的结果,还开始收到上一年的结果。具体而言,2016年12月的审计报告包括2016年12月和2015年12月的数据。起初,我认为这是一个基于今年转折

我有一个基于VisualStudio的存储过程,它为每月的审核过程生成报告。在被查询的数据库中,每个月的所有数据都保存在各自的表中(Contacts\u month\u 1、Contacts\u month\u 2等)

此报告生成中使用的SQL包含一些次要逻辑,以允许它动态工作,而不是使用硬编码日期。问题出现在2017年1月初,当时我不仅开始收到上个月的结果,还开始收到上一年的结果。具体而言,2016年12月的审计报告包括2016年12月和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')

据我所知,
@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语句,以检查返回的结果,您可以使用一月和2016检查过程中的实际问题还是查询中的问题


希望它有帮助

谢谢你的帮助,我找到了问题的根源,这是因为我在尝试运行T-SQL语句时没有将GetYear转换为varchar。这反过来又导致变量被完全忽略。我也在意识到自己做得很糟糕之后,稍微整理了一下查询

下面是已清理的函数查询,以便将来对某人有所帮助:

Declare @GetMonth SmallInt,
@SessionTable varchar(50),
@ContactTable varchar(50),
@TableVersion varchar(2),
@GetYear SmallInt,
@YearCheck varchar(4)

Set @GetMonth=MONTH(cast(GetDate() as Datetime))-1
Set @GetYear=YEAR(cast(GetDate() as Datetime))-1

If (@GetMonth=0) 
Begin
    Set @GetMonth =12
    Set @GetYear =@GetYear - 1
End

Set @TableVersion=CAST(@GetMonth as varchar(2))
Set @SessionTable='[CentralDWH].[dbo].[Sessions_month_' +@tableversion +']'
Set @ContactTable ='[CentralDWH].[dbo].[Contacts_month_' +@tableversion +']'
Set @YearCheck=CAST(@GetYear as varchar(4))

--Select @GetMonth,@GetYear,@YearCheck (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 year(c.[local_start_time]) > '+@YearCheck+'
   order by local_start_time')

一旦我清理了所有这些,并记得正确地分配年份,一切都会就绪。

这确实是我试图指定GetYear-1更改背后的想法。我决不是一个经验丰富的查询编写者,我正试图根据过去4年中我从未尝试过的知识将所有这些拼凑起来。更令人困惑的是,如果删除所有@GetYear引用,结果集中仍然会提供2年的数据。我会在这方面做更多的挖掘,看看我能做些什么。我很感激你提供的指导。在这种情况下,我建议在WHERE子句中检查你的联接和条件,问题一定在某个地方。很高兴我能帮忙,如果你找到原因,请告诉我。