2012-08-22 43 views
0

我的第一個帖子的時候完美的作品,所以請溫柔與我:)更新語句,但在這裏手動運行

我有我需要一些源數據的存儲過程,做一些操作,在其上運行一些更新語句,然後將數據放入我們的主數據表(我想你可以說它是一個ETL)。我遇到的問題是我編寫的一些更新語句在程序運行時似乎沒有奏效,但是,如果我在一個單獨的查詢窗口中手動運行它們,它們可以很好地工作。技術上有兩部分更新聲明和一個部分更新,另一個失敗,這進一步增加了我的麻煩。

的用於更新的代碼段如下所示:

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' 

的代碼更新2列在我的源表,其中記錄的MRC落在底座和高MRC之間。佣金是沒有更新的值,但MRCBand正確更新。

的MappingiPhoneCommission表有以下幾列:

  • BaseMRC
  • HighMRC
  • 委員會
  • MRCBand

如果任何人都可以擺脫任何光線到爲什麼會在失敗存儲過程,但在新的查詢窗口中運行良好,我將非常感激。

如果您需要任何進一步的信息,請讓我知道,我會盡力提供所需的。

親切的問候 託尼

+0

更新pCommissionValue的子查詢總是返回單個值? – Farhan

+0

當您在存儲過程之外運行查詢時,是否只運行UPDATE語句或該存儲過程中的所有內容? – Farhan

+0

如果我運行整個過程不作爲過程,列不更新,但只運行我張貼的代碼,確實工作。映射表基本上有以下0,25,5,Bronze; 26,35,7,Silver; 36,99999,9,Gold。這些是虛構的記錄,但是聲明所做的是採用記錄的MRC值,找出它適合的基本和高MRC範圍,並返回COMMI值和MRCBand。例如,如果記錄MRC是35,委員會將是7和MRCBand銀。 – Gortreck

回答

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 
+0

大家好,我已經解決了這個問題。我所得到的是另一個更新聲明,後來在我的上面的聲明中寫過。我已經通過使用內部連接來解決這個問題。謝謝大家的意見和大家指點。 – Gortreck

0

如果存儲過程沒有一個try catch塊,然後把一個在有可能的SP失敗只是本次更新這就是爲什麼它不上面。如果沒有trycatch塊,你可能不會回滾整個事務或冒着實際錯誤。