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
  • 高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

如果存储的 proc 没有 try catch 块,则放入一个。 SP 可能在此更新之上失败,这就是它没有发生的原因;如果没有 trycatch 块,您可能不会回滚整个事务或冒泡实际错误。

于 2012-08-22T18:15:26.267 回答
-3

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

于 2018-03-25T22:10:27.167 回答