2017-02-01 5 views
0

私は、毎月の監査プロセスのレポートを生成するVisual Studioベースのストアドプロシージャを使用しています。照会されるデータベースでは、毎月のすべてのデータが個別のテーブル(Contacts_month_1、Contacts_month_2など)に存在します。ストアドプロシージャレポート生成の結果セットでの問題

このレポート生成で使用されるSQLには、軽微なロジックが含まれています。ハードコーディングされた日付を使用するよりも。この問題は、2017年1月の初めに発生しました。前の月の結果だけでなく、前年の結果も受け取り始めました。具体的には、2016年12月の監査レポートには、2012年12月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_' [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に設定している理由がわかりませんが、これが問題の原因と思われます。

今月が1(1月)の前年の12月を取得しますか?そうならば、あなたは簡単に

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

その他の問題にIfブロックを変更することができます。

  • これは、変数@GetMonth@getmonthの名前の一貫性を保つことをお勧めします、これがあれば、エラーが発生しますデータベース照合では大文字と小文字が区別されます。あなたは年

を保存しようとする場合、私はあなたがチェックするためにいくつかのハードコードされた値で、ここで構成され、動的SQLステートメントをテストするお勧めします

  • @GetMonthTinyIntとして宣言され、これは、算術オーバーフローが発生します結果が返された場合は、1月と2016年を使用して、プロシージャ内の実際の問題またはクエリに問題がないかどうかを確認できます。

    が、それはあなたの助けを

  • +0

    これは確かにGetYear-1の変更を指定しようとしている私の考えでした。私は決して熟練したクエリー・ライターではなく、私は過去4年間に運動しようとしなかった知識に基づいてこれをすべて一緒に断片化しようとしています。 @GetYearの参照をすべて削除すると、結果セットに2年分のデータが残ってしまいます。 私はこれをもっと掘り下げて、私が引き取ることができるものを見ていきます。あなたが提供した方向性に感謝します。 –

    +0

    その場合は、WHERE句でジョインと条件をチェックすることをお勧めします。問題はどこかにあるはずです。私が助けてくれることを嬉しく思っています。あなたがその原因を見つけたら教えてください。 – Cosmin

    0

    感謝を役に立てば幸い、私は問題の根本を考え出し、およびT-SQLステートメントを実行しようとしたとき、私はvarchar型としてgetYearメソッドをキャストされなかったので、それがでした。その結果、変数は完全に無視されました。私はまた、私がかなり頑張っていることを実感した後、ちょっと質問をきれいにしました。それが将来的に誰かを助けることができるように

    以下

    は、クリーンアップ機能クエリです:私はこのすべてをクリーンアップし、適切今年キャストする思い出したら

    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') 
    

    、すべてが場所に落ちました。