2017-08-24 13 views
0

私は毎日実行したいストアドプロシージャを持っています。私はテーブルを切り捨て、テスト中SQL 2014ストアドプロシージャテーブルチェックがnullのテーブルに挿入

-- MAKE SURE IT WAS NOT RUN FOR THE DAY ALREADY 
AND CAST(GETDATE() AS date) != (SELECT MAX(RUNDATE) FROM smsdss.c_ins_bal_amt) 

:私は、現在の日付がそうのようなテーブルで最大の日付に等しい場合、それは表にデータを挿入することはできませんストアドプロシージャでの制約があります。私がsp exec smsdss.c_ins_bal_amt_sp;を実行し、結果のテーブルのデータをチェックしたところ、それは空白でした。だから、INSERTクエリを実行しました。テーブルがすでに作成されていて、十分な結果が得られていない場合、前述の行が原因であることがわかりました。

どうすればこの問題を修正できますか?私は右の後よりもあなたを理解していれば

/* 
Check to see if the table even exists. If not create and populate, else insert 
new records only if the run date is not already in the table. 
*/ 
IF NOT EXISTS (
    SELECT TOP 1 * FROM sysobjects WHERE name='c_ins_bal_amt' AND xtype='U' 
) 


BEGIN 
    CREATE TABLE smsdss.c_ins_bal_amt (
     PK INT IDENTITY(1, 1) PRIMARY KEY NOT NULL 
     , pt_id char(13) NOT NULL 
     , unit_seq_no int NULL 
     , cr_rating VARchar(2) NULL 
     , vst_end_date date NULL 
     , fc VARchar(4) NULL 
     , hosp_svc char(4) NULL 
     , Age_In_Days Int NULL 
     , pyr_cd varchar(6) NOT NULL 
     , pyr_seq_no int NOT NULL 
     , tot_chg_amt money NULL 
     , tot_enc_bal_amt money NULL 
     , ins_pay_amt money NULL 
     , pt_bal_amt money NULL 
     , Ins_Bal_Amt money NULL 
     , tot_pay_amt money NULL 
     , pt_pay_amt money NULL 
     , GuarantorDOB date NULL 
     , GuarantorFirst varchar(30) NULL 
     , GuarantorLast varchar(60) NULL 
     , ins1_pol_no varchar(20) NULL 
     , ins2_pol_no varchar(20) NULL 
     , ins3_pol_no varchar(20) NULL 
     , ins4_pol_no varchar(20) NULL 
     , RunDate date NOT NULL 
     , RunDateTime datetime NOT NULL 
     , RN INT 
    ) 

INSERT INTO smsdss.c_ins_bal_amt 

SELECT PYRPLAN.pt_id 
, VST.unit_seq_no 
, VST.cr_rating 
, CAST(VST.vst_end_date AS date)      AS [vst_end_date] 
, VST.fc 
, VST.hosp_svc 
, CAST(DATEDIFF(DD, VST.VST_END_DATE, GETDATE()) AS int) AS [Age_In_Days] 
, PYRPLAN.pyr_cd 
, PYRPLAN.pyr_seq_no 
, CAST(VST.tot_chg_amt AS money)      AS [tot_chg_amt] 
, CAST(VST.tot_bal_amt AS money)      AS [tot_enc_bal_amt] 
, CAST(VST.ins_pay_amt AS money)      AS [ins_pay_amt] 
, CAST(VST.pt_bal_amt AS money)      AS [pt_bal_amt] 
, CASE 
    WHEN PYRPLAN.PYR_CD = '*' THEN 0 
    ELSE CAST(PYRPLAN.tot_amt_due AS money) 
    END            AS [Ins_Bal_Amt] 
, CAST(VST.tot_pay_amt AS money) AS [tot_pay_amt] 
, CAST((VST.tot_pay_amt - VST.ins_pay_amt) AS money) AS [pt_pay_amt] 
, CAST(guar.GuarantorDOB as date)     AS [GuarantorDOB] 
, guar.GuarantorFirst 
, guar.GuarantorLast 
, vst.ins1_pol_no 
, vst.ins2_pol_no 
, vst.ins3_pol_no 
, vst.ins4_pol_no 
, [RunDate] = CAST(GETDATE() AS date) 
, [RunDateTime] = GETDATE() 
, [RN] = ROW_NUMBER() OVER(
    PARTITION BY PYRPLAN.PT_ID 
    ORDER BY PYRPLAN.PYR_SEQ_NO 
) 

FROM SMSMIR.PYR_PLAN AS PYRPLAN 
LEFT JOIN smsmir.vst_rpt VST 
ON PYRPLAN.pt_id = VST.pt_id 
     AND PYRPLAN.unit_seq_no = VST.unit_seq_no 
LEFT JOIN smsdss.c_guarantor_demos_v AS GUAR 
ON VST.pt_id = GUAR.pt_id 
    AND VST.from_file_ind = GUAR.from_file_ind 

WHERE VST.tot_bal_amt > 0 
AND VST.vst_end_date IS NOT NULL 
AND VST.fc not in (
    '1','2','3','4','5','6','7','8','9' 
) 

ORDER BY PYRPLAN.pt_id 
, PYRPLAN.pyr_cd 
END 

ELSE 
    INSERT INTO smsdss.c_ins_bal_amt 
    SELECT PYRPLAN.pt_id 
    , VST.unit_seq_no 
    , VST.cr_rating 
    , CAST(VST.vst_end_date AS date)      AS [vst_end_date] 
    , VST.fc 
    , VST.hosp_svc 
    , CAST(DATEDIFF(DD, VST.VST_END_DATE, GETDATE()) AS int) AS [Age_In_Days] 
    , PYRPLAN.pyr_cd 
    , PYRPLAN.pyr_seq_no 
    , CAST(VST.tot_chg_amt AS money)      AS [tot_chg_amt] 
    , CAST(VST.tot_bal_amt AS money)      AS [tot_enc_bal_amt] 
    , CAST(VST.ins_pay_amt AS money)      AS [ins_pay_amt] 
    , CAST(VST.pt_bal_amt AS money)      AS [pt_bal_amt] 
    , CASE 
     WHEN PYRPLAN.PYR_CD = '*' THEN 0 
     ELSE CAST(PYRPLAN.tot_amt_due AS money) 
     END            AS [Ins_Bal_Amt] 
    , CAST(VST.tot_pay_amt AS money) AS [tot_pay_amt] 
    , CAST((VST.tot_pay_amt - VST.ins_pay_amt) AS money) AS [pt_pay_amt] 
    , CAST(guar.GuarantorDOB as date)     AS [GuarantorDOB] 
    , guar.GuarantorFirst 
    , guar.GuarantorLast 
    , vst.ins1_pol_no 
    , vst.ins2_pol_no 
    , vst.ins3_pol_no 
    , vst.ins4_pol_no 
    , [RunDate] = CAST(GETDATE() AS date) 
    , [RunDateTime] = GETDATE() 
    , [RN] = ROW_NUMBER() OVER(
     PARTITION BY PYRPLAN.PT_ID 
     ORDER BY PYRPLAN.PYR_SEQ_NO 
    ) 

    FROM SMSMIR.PYR_PLAN AS PYRPLAN 
    LEFT JOIN smsmir.vst_rpt VST 
    ON PYRPLAN.pt_id = VST.pt_id 
      AND PYRPLAN.unit_seq_no = VST.unit_seq_no 
    LEFT JOIN smsdss.c_guarantor_demos_v AS GUAR 
    ON VST.pt_id = GUAR.pt_id 
     AND VST.from_file_ind = GUAR.from_file_ind 

    WHERE VST.tot_bal_amt > 0 
    AND VST.vst_end_date IS NOT NULL 
    AND VST.fc not in (
     '1','2','3','4','5','6','7','8','9' 
    ) 
    -- MAKE SURE IT WAS NOT RUN FOR THE DAY ALREADY 
    AND CAST(GETDATE() AS date) != (SELECT MAX(RUNDATE) FROM smsdss.c_ins_bal_amt) 

    ORDER BY PYRPLAN.pt_id 
    , PYRPLAN.pyr_cd 
; 
+0

ので、あなたの問題は、(smsdss.c_ins_bal_amt FROM MAX(RUNDATE)を選択)がNULLを返すことができるということですか? – GuidoG

答えて

1

あなたが何らかの形で、将来的にテーブルを切り捨てる場合は、あなたがするストアドプロシージャを望むものを言うことはありません。あなただけのSPを停止したい場合は一方で、あなたはそれが日付の制約を無視したい場合は、単に日付の制約に同じ条件を入れて、最初

If Not Exists (Select * from smsdss.c_ins_bal_amt) return 0 

でストアドプロシージャにチェックを追加ロジック:

WHERE VST.tot_bal_amt > 0 
    AND VST.vst_end_date IS NOT NULL 
    AND VST.fc not in ('1','2','3','4','5','6','7','8','9') 
    -- MAKE SURE IT WAS NOT RUN FOR THE DAY ALREADY 
    AND (Not exists(Select * from smsdss.c_ins_bal_amt)Or 
     CAST(GETDATE() AS date) != 
      (SELECT MAX(RUNDATE) 
      FROM smsdss.c_ins_bal_amt)) 

か、あるいは:

WHERE VST.tot_bal_amt > 0 
    AND VST.vst_end_date IS NOT NULL 
    AND VST.fc not in ('1','2','3','4','5','6','7','8','9') 
    -- MAKE SURE IT WAS NOT RUN FOR THE DAY ALREADY 
    AND CAST(GETDATE() AS date) != 
      CAST(coalesce(
       (SELECT MAX(RUNDATE FROM smsdss.c_ins_bal_amt), 
       getdate()) as date) 
+0

助けていただきありがとうございます。あなたが提示した代替案は結果を返しませんが、合体日がgetdate() –

1

:私はいくつかの理由で(実際に起こるべきではありません...しかし)将来的には、テーブルを切り捨てる場合はここで

は、その中のspは、必要に応じて全体だですチェック (SELECT MAX(RUNDATE) FROM smsdss.c_ins_bal_amt)は、あなたが実際にこれをやっていることを意味し

はnullを返します切り捨て:!

AND CAST(GETDATE() AS date) != NULL 

そして、あなたが使用してNULLを比較することはできません=
だから私が正しくあなたの質問を理解していれば、あなただけに必要であっても、それがあなたのテーブルが

1
AND CAST(GETDATE() AS date) != (SELECT isnull(MAX(RUNDATE), '19000101') FROM smsdss.c_ins_bal_amt) 
1

をtrucatedされ、この

AND CONVERT(date, GETDATE()) <> convert(date, isnull((SELECT MAX(RUNDATE) FROM smsdss.c_ins_bal_amt), getdate() - 1)) 

ようにあなたが常に有効な日付にチェックされている。この方法は、あなたの小切手を調整

AND 
(
    CAST(GETDATE() AS date) != (SELECT MAX(RUNDATE) FROM smsdss.c_ins_bal_amt) 
OR NOT EXISTS (SELECT * FROM smsdss.c_ins_bal_amt) 
) 

RUNDATE

がすでにのように定義されます。そのテーブルのすべてのレコードがあるかどうかを確認します0のため、テーブルのレコードの存在を探していれば十分です。

1

はダミーの日付と日付チェックの周りISNULLを入れてみてください:

AND CAST(GETDATE() AS date) != isnull((SELECT MAX(RUNDATE) 
    FROM smsdss.c_ins_bal_amt) , '7/4/1776') 
関連する問題