我有一个简单的示例数据库表,名为test
,其中列name
是nvarchar
,列value
是decimal,9,2
>
我试图理解以下SQL语句为何失败:
insert into [test] ([name], [value]) values ('test1', '33.9'), ('test2', 33)
这给出了一个错误
[22018] [Microsoft] [SQL Server Native Client 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输出)。