2017-02-01 3 views
0

У меня есть хранимая процедура на основе Visual Studio, которая генерирует отчет для ежемесячного процесса аудита. В запрошенной базе данных все данные за каждый месяц живут в отдельной таблице (Contacts_month_1, Contacts_month_2 и т. Д.)Проблема с набором результатов из генерации отчета хранимой процедуры

SQL, используемый в генерации этого отчета, включает в себя некоторую небольшую логику, позволяющую ей работать динамически, а чем использовать жестко закодированные даты. Проблема возникла в начале января 2017 года, когда я начал получать не только результаты за предыдущий месяц, но и в предыдущий год. Чтобы быть конкретным, отчет аудита за декабрь 2016 года включал данные как для 12/2016, так и 12/2015. Первоначально я думал, что это был случайный случай, основанный на повороте года, и на данный момент у нас не было этого автоматизированного процесса. К сожалению, когда я пришел в офис сегодня, в выходной файл за январь 2017 года, я также получил результаты за январь 2016 года.

Я попытался включить проверку года в процесс, однако я все равно получаю тот же результат вывод. Любые идеи были бы хорошы.

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_' [email protected] +']' 
Set @ContactTable ='[CentralDWH].[dbo].[Contacts_month_' [email protected] +']' 

-- 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 '[email protected] +' 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

Как я понимаю, переменная @GetMonth используется для возврата к предыдущему месяцу

Set @GetMonth = MONTH(CAST(GetDate() AS Datetime)) - 1 

После беглого взгляда после вас процедуры мой первый вопрос был эта строка кода:

IF (@getmonth = 0) 
    SET @GetMonth = 12 + (@GetYear - 1) 

Я не понимаю, почему вы устанавливаете переменную @GetMonth в 12 + текущий год -1, и я предполагаю, что это является причиной этой проблемы.

Вы хотите получить 12-й месяц предыдущего года, когда текущий месяц равен 1 (январь)? Если да, то вы можете легко изменить блок Если

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

Другие вопросы:

  • Рекомендуется, чтобы сохранить согласованность имен переменных @GetMonth, @getmonth, это приведет к ошибке, если сопоставление базы данных чувствительно к регистру.

  • @GetMonth объявлен как TinyInt и это вызовет арифметическое переполнение, если вы пытаетесь, чтобы сохранить год

Я рекомендую испытывать динамический оператор SQL, который вы составляете здесь с некоторыми трудно закодированных значений для проверки возвращенные результаты, вы можете использовать январь и 2016, чтобы проверить, действительно ли проблема в вашей процедуре или она находится в вашем запросе.

Надеется, что это помогает

+0

Это была моя идея, пытаясь определить изменение GetYear-1. Я отнюдь не опытный автор запросов, и я пытаюсь разделить все это на основе знаний, которых я не пытался реализовать за последние 4 года. Чем больше запутанного бита, если вы удалите все ссылки @GetYear, он все равно обеспечит данные в течение двух лет в наборе результатов. Я сделаю еще кое-что, чтобы понять, что я могу сделать. Я ценю ваше направление. –

+0

В этом случае я предлагаю проверить ваши соединения и ваши условия в предложении WHERE, проблема должна быть где-то там. Рад, что я мог бы помочь и, пожалуйста, дайте мне знать, если вы найдете причину этого. – Cosmin

0

Спасибо за вашу помощь, я понял, корень проблемы, и это потому, что я не был заливка GetYear как VARCHAR при попытке запустить оператор T-SQL. Это, в свою очередь, заставило переменную полностью игнорировать. Я также немного почистил запрос после того, как понял, что у меня довольно сложно.

Ниже очищен функциональный запрос, так что он может помочь кому-то в будущем:

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 [email protected] - 1 
End 

Set @TableVersion=CAST(@GetMonth as varchar(2)) 
Set @SessionTable='[CentralDWH].[dbo].[Sessions_month_' [email protected] +']' 
Set @ContactTable ='[CentralDWH].[dbo].[Contacts_month_' [email protected] +']' 
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 '[email protected] +' 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]) > '[email protected]+' 
    order by local_start_time') 

После того, как я очистил все это и помнить, чтобы бросить год правильно, все встало на свои места.

Смежные вопросы