0

ここに私の最初の投稿なので、私に優しくしてください:)

ソースデータを取得し、操作を行い、更新ステートメントを実行してから、データをメインデータテーブルに入れるストアドプロシージャがあります (ETL と言えるでしょう)。私が抱えている問題は、私が書いた update ステートメントの一部が、プロシージャの実行時に機能していないように見えることですが、別のクエリ ウィンドウで手動で実行すると、完全に機能します。技術的には、2 つの部分があります。ステートメントを更新すると、一部が更新され、もう一方が失敗するため、問題がさらに複雑になります。

更新のコード スニペットは次のとおりです。

UPDATE Prod_DDb.dbo.DataLoadTeleconnect
SET    pCommissionValue = (SELECT Commission
                           FROM   dbo.MappingiPhoneCommission
                           WHERE  Prod_DDb.dbo.DataLoadTeleconnect.pMRC BETWEEN BaseMRC AND HighMRC),
       pMRCBand = (SELECT MRCBand
                   FROM   dbo.MappingiPhoneCommission
                   WHERE  Prod_DDb.dbo.DataLoadTeleconnect.pMRC BETWEEN BaseMRC AND HighMRC)
WHERE  pMapID = 'iPhone'

このコードは、レコードの MRC がベース mrc とハイ mrc の間にあるソース テーブルの 2 つの列を更新します。コミッションは更新されていない値ですが、MRCBand は正しく更新されます。

MappingiPhoneCommission テーブルには、次の列があります。

  • BaseMRC
  • 高MRC
  • 手数料
  • MRCバンド

これがストアド プロシージャでは失敗するが、新しいクエリ ウィンドウでは正常に実行される理由を誰かが明らかにすることができれば、私は最も感謝しています。

さらに情報が必要な場合はお知らせください。必要なものを提供できるよう努めます。

よろしくトニー

4

3 に答える 3

0

このコードがストアドプロシージャで異なる動作をする理由は見当たらないので、ストアドプロシージャが更新前にデータを変更すると思います。実行時の実際のデータを確認するために、ストアドプロシージャにいくつかのチェックを追加することをお勧めします。更新の直前に次の追加を開始する場合があります。

SELECT * FROM Prod_DDb.dbo.DataLoadTeleconnect WHERE  pMapID = 'iPhone'
SELECT Commission FROM dbo.MappingiPhoneCommission, Prod_DDb.dbo.DataLoadTeleconnect
WHERE Prod_DDb.dbo.DataLoadTeleconnect.pMRC BETWEEN dbo.MappingiPhoneCommission.BaseMRC AND dbo.MappingiPhoneCommission.HighMRC
SELECT MRCBand FROM dbo.MappingiPhoneCommission, Prod_DDb.dbo.DataLoadTeleconnect
WHERE Prod_DDb.dbo.DataLoadTeleconnect.pMRC BETWEEN dbo.MappingiPhoneCommission.BaseMRC AND dbo.MappingiPhoneCommission.HighMRC
于 2012-08-22T15:16:30.137 に答える
0

ストアド プロシージャに try catch ブロックがない場合は、1 つ入れます。この更新のすぐ上で SP が失敗している可能性が高いため、発生しません。trycatch ブロックがないと、トランザクション全体をロールバックしていない可能性があります。実際のエラーを泡立てます。

于 2012-08-22T18:15:26.267 に答える