2017-04-13 9 views
1

EXEを使用して、あるセットのテーブルから別のセットにデータを移動するためにストアドプロシージャを1時間に2回呼び出すと同時に、別のテーブルのカウントを更新してストアドプロシージャが実行された。 EXEはストアドプロシージャを特定の番号で呼び出して、ストアドプロシージャにどのインサートを実行するかを指示します。したがって、この手順を二回実行される毎時間、:ストアドプロシージャ更新ステートメントをスキップする

If @intUploadNumber = 1 
INSERT INTO Prod1 
SELECT * 
FROM Staging1 

UPDATE tbl_Count 
SET UpdateCount = UpdateCount + 1 
WHERE Date = CAST(GETDATE() AS DATE) 

If @intUploadNumber = 2 
INSERT INTO Prod2 
SELET * 
FROM Staging2 

UPDATE tbl_Count 
SET UpdateCount = UpdateCount + 1 
WHERE Date = CAST(GETDATE() AS DATE) 

EXEは基本的でプロシージャを呼び出す:ストアドプロシージャの下部に

exec STRPRC 1 
exec STRPRC 2 

は次のとおりです。

IF ((select updatecount from tbl_Count WHERE Date = CAST(GETDATE() AS DATE)) % 2 = 0) 
BEGIN 
INSERT INTO Prod3 
SELECT * 
FROM PROD1 
LEFT JOIN PROD2 ON PROD1.CID = PROD2.CID 
END 

しかし、私は自分のコードに気づいています。たとえexec(s)が正しく呼び出されていて、ステージングからのすべてが実動に入っても、ストアドプロシージャはeではなく最後のif文を渡すことがよくあります私の最後の挿入物を放つ。

これが起こることを許可するMS SQLの問題を知っている人はいますか?たぶん、ストアドプロシージャの呼び出し時に、updatecountが最後のif文に当たるまでに正しく設定されていないためです。私はまた、TRY ...キャッチSQLを囲んで、私のすべてのエラーを別のテーブルにダンプする必要がありますが、それは空のままです。詳細が必要な場合は、私にお知らせください。 (いいえ、私は別に、彼らは個別に呼び出される必要があり、最初の挿入の両方を呼び出す離れEXEから移動することはできません。)

+2

を実行するための唯一のステートメントを持っている場合でも、BEGIN/ENDブロックの区切り文字を使用することを好むが、「誰もこれが起こることを可能とするMS SQLの問題を知っていますか?」*はいそれはあなたがそれを伝えるものです。ブレークポイントを設定するか、いくつかのロギングや何かを入れることをお勧めします。 'select updatecount from tbl_Count WHERE Date = CAST(GETDATE()AS DATE))%2 = 0'によって返される値は、です。 –

+1

実際にコードをコピー&ペーストしましたか? B/c SELETの明らかなタイプミス – peterG

+1

ここに詳細を記入する必要があります。おそらくあなたは空のキャッチで試してみると、この全体が走っていますか?挿入物を明示的に習得する必要があります。すべての列に名前を付け、select *をソースとして使用する必要はありません。 –

答えて

2

ありがとうあなたはパラメータ1とし、その時点で、このストアドプロシージャを呼び出すと仮定時間のあなたのUPDATECOUNTが奇数値である(の1を想定してみましょう)

今SPでコードの流れは以下の通りです:

Is @intUploadNumber = 1  => Yes then Insert 
set updatecount to itself + 1 => updatecount is 2 
Is @intUploadNumber = 2  => No then skip the Insert 
set updatecount to itself + 1 => updatecount is 3 

この時点で最後の中%(MOD)操作IFステートメントは0の代わりに1を与え、したがって最終的なINSERTは実行されません

私は、SPが2回呼び出されないときにUpdateCountを1回だけインクリメントしたいとします。したがって、最初のUPDATEステートメントを削除し、最後のステートメントだけを残すことができます。
私は*常にあなたが

IF @intUploadNumber = 1 
    BEGIN 
     INSERT INTO Prod1 SELECT * FROM Staging1 
    END 
ELSE 
    BEGIN 
     IF @intUploadNumber = 2 
      BEGIN 
       INSERT INTO Prod2 SELECT * FROM Staging2 
      END 
     ELSE 
      RAISERROR ('Invalid parameter value',16,1) 
    END 

UPDATE tbl_Count SET UpdateCount = UpdateCount + 1 
WHERE Date = CAST(GETDATE() AS DATE) 
関連する問題