【发布时间】: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