Почему одна конкретная база данных SQL Server не может преобразовать VARCHAR в NUMERIC? - PullRequest
0 голосов
/ 30 января 2019

Возможно ли, что две разные базы данных SQL Server, имеющие одинаковую схему и данные, могли обрабатывать запрос по-разному, и одна из них выдает ошибку "Error converting data type varchar to numeric.", а другая - нет?

Например, см. Этот запрос:

SELECT count(*) FROM DEPARTMENTS dpt
inner join
EMPLOYEES emp
on dpt.subgroup_id = emp.subgroup_id
WHERE
emp.employee_id = 12856
and
dpt.department_id in
(   
    select cm.mapped_value from CONFIGURATIONS c
    inner join
    CONFIG_MAPPINGS cm on cm.configuration_id = c.id
    where
    c.name = 'Department that can override self-destruction protocol'
)

Внутренний подзапрос select возвращает либо значение, которое может быть приведено к числу, либо результаты вообще отсутствуют.Итак, я заметил, что:

  1. Одна база данных, работающая Microsoft SQL Server 2012 - 11.0.2100.60, выполняет запрос без ошибок, пока внутренний оператор не вернет нечисловое значение
  2. Другая база данных, работающая Microsoft SQL Server 2012 (SP4-GDR) (KB4057116) - 11.0.7462.6, всегда выдает ошибку «Error converting data type varchar to numeric.», независимо от того, что возвращает внутренний запрос выбора.

Я также заметил, что если я изменю подзапрос другим, которыйвозвращает точно так же, но без внутреннего объединения, вторая база данных не выдает ошибку

SELECT count(*) FROM DEPARTMENTS dpt
inner join
EMPLOYEES emp
on dpt.subgroup_id = emp.subgroup_id
WHERE
emp.employee_id = 12856
and
dpt.department_id in
(   
    select cm.mapped_value FROM CONFIG_MAPPINGS
    WHERE cm.configuration_id = 'DPT_OVERRIDE_SDP'
)

Я знаю, что мне все равно нужно улучшить запрос, добавив проверку ISNUMERIC, но просто из любопытства, мой вопрос:

Может ли быть так, что одна из этих баз данных обрабатывает запрос другим способом (возможно, другой план выполнения) и всегда выдает ошибку, в то время как другой базе данных удается выполнить запрос?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

После сравнения планов выполнения в обеих базах данных я заметил, что они совершенно разные.

Если план объединял DEPARTMENTS и CONFIG_MAPPINGS до объединения CONFIG_MAPPINGS с CONFIGURATIONS, идо применения фильтра c.name = .. мы должны были присоединиться к dpt.department_id (numeric) = cm.mapped_value, тогда как mapped_value также будет содержать нечисловые значения в этой точке.

Это относится ко второй базе данных, и это объясняет ошибку преобразования

0 голосов
/ 30 января 2019

Выполните следующие запросы:

select cm.mapped_value FROM CONFIG_MAPPINGS
WHERE cm.configuration_id = 'DPT_OVERRIDE_SDP' AND ISNUMERIC(cm.mapped_value)<>1

и

select cm.mapped_value from CONFIGURATIONS c
inner join
CONFIG_MAPPINGS cm on cm.configuration_id = c.id
where
c.name = 'Department that can override self-destruction protocol'
AND ISNUMERIC(cm.mapped_value)<>1

, чтобы увидеть, какие значения являются причиной ошибки.Затем вы можете использовать «ISNUMERIC (cm.mapped_value) = 1» во внутреннем запросе, чтобы игнорировать их.

...