«Ошибка преобразования в int» при приведении к десятичной - PullRequest
0 голосов
/ 18 мая 2018

Почему я получаю сообщение об ошибке с типом данных INT при приведении к десятичному типу?

SELECT
    a.number, --nvarchar
    b.number  --nvarchar
FROM
    TableA AS a
    TableB AS b
WHERE
    CAST(COALESCE(a.number, 0), AS DECIMAL(10,2)) <> CAST(COALESCE(b.number, 0), AS DECIMAL(10,2))

Ошибка:

Сообщение 245, Уровень 16, Состояние 1, Строка 156 Преобразование не удалось при преобразовании значения nvarchar '78000.0' в тип данных int.

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Похоже, потому что вы делаете Coalese для числовых полей (которые являются nvarchar) и числа, вашего 0. Переместите свой бросок внутрь Coalese (или приведите также столбец, который является nvarchar.

Делая это, выдает ошибку преобразования, потому что вы не можете объединить строку и число

SELECT COALESCE('A', 0) -- errors out, and this is basically what your doing

SELECT
    a.number, --nvarchar
    b.number  --nvarchar
FROM
    TableA AS a
    TableB AS b
WHERE
COALESCE(CAST(a.number AS DECIMAL(10,2)), 0) <> COALESCE(CAST(b.number AS DECIMAL(10,2)), 0)
0 голосов
/ 18 мая 2018

Проблема заключается в типе данных, которые вы пытаетесь преобразовать, в этом поле есть нечисловые записи, поэтому при условии, что вы должны добавить ключ "ISNUMERIC" в условии:

SELECT
a.number, --nvarchar
b.number  --nvarchar
FROM
TableA AS a
TableB AS b
WHERE
CAST(COALESCE(ISNUMERIC(a.number)), 0), AS DECIMAL(10,2)) <> CAST(COALESCE(ISNUMERIC(b.number), 0), AS DECIMAL(10,2))
0 голосов
/ 18 мая 2018

Это происходит потому, что coalesce ожидает, что a.number, nvarchar, будет совместимо с 0, int.Вот где происходит сбой преобразования, поскольку nvarchar и int несовместимы.

Замена 0 на '0' должна решить проблему:

CAST(COALESCE(a.number, `0`), AS DECIMAL(10,2))

Примечание: Если это не устаревшая база данных, которую вы не можете контролировать, вам следует рассмотреть возможность изменения типа поля number на число, ну, например, decimal(10,2).

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