【问题标题】:Query that detects the differences between yesterdays load and todays load but populates error检测昨天负载和今天负载之间差异但填充错误的查询
【发布时间】:2019-10-24 13:27:32
【问题描述】:

我们正在转换旧的旧程序并将其集成到 SSIS 中。旧程序向需要通知帐户更改的最终用户输出一个显示帐户差异的文件。这是我试图执行此操作的查询,但我收到错误“varchar 值'02393224650'的转换溢出了一个 int 列。”在你说“可能重复”之前。其他帖子都没有正确回答这个问题,也没有涉及以这种方式实现逻辑的查询。


      SELECT
      a.run_id,
      a.AccountNumber,
      a.AccountBranch,
      a.AccountName,
      a.AccountType,
      a.CostCenter,
      b.TransactionLimit,
      b.ClientName,
      b.DailyCumulativeLimit
    FROM 
      AEI_GFXAccounts a
      LEFT JOIN AEI_GFXAccountSTP as b
      ON 
        a.feed_id = b.feed_id and 
        a.run_id = b.run_id and a.GFXAccountsID = b.GFXAccountSTPID), 
yest AS (
  SELECT * FROM data WHERE run_id = (SELECT MAX(run_id)-1 FROM AEI_GFXAccounts)
),
toda AS (
  SELECT * FROM data WHERE run_id = (SELECT MAX(run_id) FROM AEI_GFXAccounts)
)

SELECT
  CASE WHEN COALESCE(yest.AccountNumber, 0) <> COALESCE(toda.AccountNumber, 0) THEN yest.AccountNumber END as yest_AccountNumber,
  CASE WHEN COALESCE(yest.AccountNumber, 0) <> COALESCE(toda.AccountNumber, 0) THEN toda.AccountNumber END as toda_AccountNumber,
  CASE WHEN COALESCE(yest.AccountBranch, 0) <> COALESCE(toda.AccountBranch, 0) THEN yest.AccountBranch END as yest_AccountBranch,
  CASE WHEN COALESCE(yest.AccountBranch, 0) <> COALESCE(toda.AccountBranch, 0) THEN toda.AccountBranch END as toda_AccountBranch,
  CASE WHEN COALESCE(yest.AccountName, 'x')   <> COALESCE(toda.AccountName, 'x')   THEN yest.AccountName   END as yest_AccountName,
  CASE WHEN COALESCE(yest.AccountName, 'x')   <> COALESCE(toda.AccountName, 'x')   THEN toda.AccountName   END as toda_AccountName,
  CASE WHEN COALESCE(yest.AccountType, 'n/a')   <> COALESCE(toda.AccountType, 'n/a')   THEN yest.AccountType   END as yest_AccountType,
  CASE WHEN COALESCE(yest.AccountType, 'n/a')   <> COALESCE(toda.AccountType, 'n/a')   THEN toda.AccountType   END as toda_AccountType,
  CASE WHEN COALESCE(yest.CostCenter, 0)   <> COALESCE(toda.CostCenter, 0)   THEN yest.CostCenter   END as yest_CostCenter,
  CASE WHEN COALESCE(yest.CostCenter, 0)   <> COALESCE(toda.CostCenter, 0)   THEN toda.CostCenter  END as toda_CostCenter,
  CASE WHEN COALESCE(yest.TransactionLimit, 0)   <> COALESCE(toda.TransactionLimit, 0)   THEN yest.TransactionLimit   END as yest_TransactionLimit,
  CASE WHEN COALESCE(yest.TransactionLimit, 0)   <> COALESCE(toda.TransactionLimit, 0)   THEN toda.TransactionLimit  END as toda_TransactionLimit,
  CASE WHEN COALESCE(yest.ClientName, 'x')   <> COALESCE(toda.ClientName, 'x')   THEN yest.ClientName   END as yest_ClientName,
  CASE WHEN COALESCE(yest.ClientName, 'x')   <> COALESCE(toda.ClientName, 'x')   THEN toda.ClientName  END as toda_ClientName,
  CASE WHEN COALESCE(yest.DailyCumulativeLimit, 0)   <> COALESCE(toda.DailyCumulativeLimit, 0)   THEN yest.DailyCumulativeLimit   END as yest_DailyCumulativeLimit,
  CASE WHEN COALESCE(yest.DailyCumulativeLimit, 0)   <> COALESCE(toda.DailyCumulativeLimit, 0)   THEN toda.DailyCumulativeLimit  END as toda_DailyCumulativeLimit

FROM
  toda LEFT JOIN yest ON toda.accountNumber = yest.AccountNumber

WHERE
  COALESCE(toda.AccountNumber,   0) <> COALESCE(yest.AccountNumber,   0) OR 
  COALESCE(toda.AccountBranch, 0) <> COALESCE(yest.AccountBranch, 0) OR      
  COALESCE(toda.AccountName,   'x') <> COALESCE(yest.AccountName,   'x') OR 
  COALESCE(toda.AccountType,   'n/a') <> COALESCE(yest.AccountType,   'n/a') OR 
  COALESCE(toda.CostCenter,   0) <> COALESCE(yest.CostCenter,   0) OR 
  COALESCE(toda.TransactionLimit,   0) <> COALESCE(yest.TransactionLimit,   0) OR 
  COALESCE(toda.ClientName,   'x') <> COALESCE(yest.ClientName,   'x') OR
  COALESCE(toda.DailyCumulativeLimit,   0) <> COALESCE(yest.DailyCumulativeLimit,   0)


      SELECT
      a.run_id,
      a.AccountNumber,
      a.AccountBranch,
      a.AccountName,
      a.AccountType,
      a.CostCenter,
      b.TransactionLimit,
      b.ClientName,
      b.DailyCumulativeLimit
    FROM 
      AEI_GFXAccounts a
      LEFT JOIN AEI_GFXAccountSTP as b
      ON 
        a.feed_id = b.feed_id and 
        a.run_id = b.run_id and a.GFXAccountsID = b.GFXAccountSTPID

我希望它返回一个仅显示所有已更改帐户的视图/查询结果。使用不依赖于填充 n/a 数据的字段。但我却得到了错误:

消息 248,第 16 级,状态 1,第 5 行

varchar 值 '02393224650' 的转换溢出了一个 int 列。

这对我来说没有意义,因为该表已经支持已存储在该表中的该卷的 int 数。

【问题讨论】:

  • 我真的怀疑你的表是否支持 23 亿的 INT 值。 BIGINT ...当然,但不是 int。
  • 如何将其转换为支持大整数。如何声明/修复它?
  • 选择 try_convert(bigint,'02393224650')
  • 前导零让我怀疑源数据中的数据类型是否不是 int 而是 varchar。我的猜测是其中一个目标表不应该是 int。

标签: sql sql-server ssis


【解决方案1】:

我找到了答案。问题是该表的设计数据类型实际上是一个 VarChar。 COALESCE 正在尝试输入一个 int。当它最终是一个varchar时。

【讨论】:

  • 。 .接受此答案或关闭问题,以便其他人知道该问题不再需要答案。
  • 它不允许我接受我自己的答案。我应该删除这篇文章吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2022-07-06
相关资源
最近更新 更多