在批量插入期间将nvarchar值转换为数据类型int时转换失败

时间:2019-06-24 08:35:13

标签: sql sql-server

我有一个简单的示例数据库表,名为test,其中列namenvarchar,列valuedecimal,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输出)。

0 个答案:

没有答案