Почему SQL Server пытается преобразовать мой тип данных nvarchar (20) в тип int? - PullRequest
0 голосов
/ 27 апреля 2018

Я получаю ошибку "преобразования" в запросе SQL Select.

Ошибка:

Сообщение 248, Уровень 16, Состояние 1, Строка 6
Преобразование значения nvarchar '7000952682' переполнило столбец int.

Проблема в том, что в моей таблице нет столбцов int!

Вот структура таблицы:

enter image description here

Вот запрос:

enter image description here

Если я установлю значение @SU на NULL, то все строки вернутся, как и ожидалось Когда значение установлено в строковое значение «7000952682», я получаю сообщение об ошибке.

Почему SQL Server пытается преобразовать значение nvarchar в int?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Не используйте case в предложении where. Логика проще и точно выражается как:

where (@su is null or @su = '' or @su = su)
0 голосов
/ 27 апреля 2018

Все ветви выражения CASE должны иметь одинаковый тип. В этом случае (без каламбура) похоже, что SQL Server использует целочисленный тип и выполняет неявное приведение SU к целому числу. Проблема заключается в том, что максимальное значение для целого числа в SQL Server составляет примерно 2,1 миллиарда, и в приведенном вами примере используется значение 7000952682, следовательно, переполнение.

У вас есть два варианта здесь. Вы можете сделать все varchar:

CASE WHEN @SU IS NULL OR @SU = '' THEN '1' ELSE [SU] END

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

CASE WHEN @SU IS NULL OR @SU = ''
     THEN CAST(1 AS numeric(20, 6))
     ELSE CAST([SU] AS numeric(20, 6)) END

В качестве примечания вы можете написать первую часть вашего выражения CASE более кратко, используя COALESCE:

CASE WHEN COALESCE(@SU, '') = '' THEN '1' ELSE [SU] END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...