从存储过程运行时更新语句不更新,但在手动运行时工作正常

时间:2012-08-22 13:55:49

标签: sql sql-server stored-procedures sql-update

我在这里的第一篇文章,所以请温柔地对待我:)

我有一个存储过程,我使用它来获取一些源数据,进行一些操作,在其上运行一些更新语句,然后将数据放入我们的主数据表(我想你可以说它是一个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

如果有人能够了解为什么这会在存储过程中失败但在新的查询窗口中运行正常,我将非常感激。

如果您需要任何进一步的信息,请告诉我,我会尽力提供所需的信息。

亲切的问候 贝

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果存储的proc没有try catch块,那么就把它放进去。可能SP刚刚在这个更新之上失败了,这就是为什么它没有发生,没有trycatch块,你可能没有回滚整个交易或冒泡实际错误。

答案 2 :(得分:-3)

您可以使用FOR循环调用select语句中的列,然后更新列。这会帮助你。