Запрос, который обнаруживает различия между вчерашней загрузкой и текущей загрузкой, но заполняет ошибку - PullRequest
0 голосов
/ 24 октября 2019

Мы конвертируем старую унаследованную программу и интегрируем ее в 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

Я ожидаю, что он выдаст результат просмотра / запроса, который отображает ТОЛЬКО все учетные записи, которые были изменены. С полями, которые не являются реивилиантными для заполнения данными нет данных. Но вместо этого я получаю сообщение об ошибке:

Сообщение 248, Уровень 16, Состояние 1, Строка 5

Преобразование значения varchar '02393224650' переполнило столбец int.

Это не имеет смысла для меня, потому что таблица уже поддерживает номера int этого тома, которые уже хранятся в таблице.

1 Ответ

1 голос
/ 24 октября 2019

Я нашел ответ. Проблема заключается в том, что таблица является типом данных проекта на самом деле VarChar. COALESCE пытается ввести int. Когда это в конечном итоге varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...