У меня есть простой пример таблицы базы данных с именем test
, где столбец name
представляет собой nvarchar
, а столбец value
представляет собой decimal,9,2
Я пытаюсь понятьпочему следующий оператор SQL не выполняется:
insert into [test] ([name], [value]) values ('test1', '33.9'), ('test2', 33)
Это приводит к ошибке
[22018] [Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Преобразование завершилось неудачно, когдапреобразование значения varchar '33 .9 'в тип данных int.(245)
В этом сценарии, поскольку одно из значений 33.9
было указано как string
, MSSQL пытается преобразовать все из них в int
?
Некоторые другие примеры, которые действительно работают:
Это работает, когда оба значения numeric
:
insert into [test] ([name], [value]) values ('test1', 33.9), ('test2', 33)
, и это работает, когда оба значения string
:
insert into [test] ([name], [value]) values ('test1', '33.9'), ('test2', '33')
также работает, когда одно значение равно string
, а другое - numeric
, если они легко приводятся к типу int:
insert into [test] ([name], [value]) values ('test1', '33'), ('test2', 33)
, оно также работает, если вы вставляете ихпо одному:
insert into [test] ([name], [value]) values ('test1', '33.9')
insert into [test] ([name], [value]) values ('test1', 33)
Приложение:
Теперь - простой ответ «просто используйте тот же тип данных».То, как мы обнаружили эту ошибку, было во время массовых вставок, когда данные берутся из приложения и вставляются.
Кажется странным, что этот один конкретный способ дает сбой только тогда, когда он вполне с удовольствием справится со всеми другими сценариями.включая вставку по одному.
Есть ли способ отключить это поведение?Или объяснение того, почему это вообще происходит?Это не происходит в mySQL, Postgres и т. Д. - все они работают.
"Почему в вашем предложении VALUES есть несовместимые типы? Проблема (кроме строки) заключается в том, чтотипы несовместимы "
В этом сценарии мы хранили значения GPS (которые являются плавающими).Случайно, возвращенный выходной сигнал GPS изменился с -33.001 до -33 во время движения автомобиля (т. Е. «Точный» выходной сигнал GPS целого числа).