sql - 将 varchar 值 '0%' 转换为数据类型 int 时转换失败

标签 sql sql-server

我遇到了 SQL Server 问题。

我创建了一个这样的表:

create table Components 
(
    pk BIGINT NOT NULL PRIMARY KEY IDENTITY,
    id VARCHAR(50),
    descr VARCHAR(50),
    in_m INT,
    in_iy INT,
    p_fw VARCHAR(5000)
);

我正在尝试插入几个值:

insert into Components (id, descr, in_m, in_iy, p_fw) 
values ('FW000_A', '0%', 0, 0, '[0.0,0.0,0.0]'),
       ('FW000_B', '1%', 1, 1, '[1.0,1.0,1.0]');

我收到以下错误:

Msg 245, Level 16, State 1, Line 111
Conversion failed when converting the varchar value '0%' to data type int.

即使列 descr 被正确定义为 varchar(50)

有人可以帮我吗?为什么 SQL Server 尝试将我的字符串转换为 int 值?

最佳答案

您的问题中缺少的是,您不仅仅拥有显示的两行 values 行,而且其他行之一具有用于 descr 的整数文字> 列,而不是字符串。

此示例产生相同的错误:

declare @t table (Descr varchar(50) not null)
insert into @t(Descr) values
('0%'),
(12)

我认为发生的情况是 SQL Server 首先尝试确定 values 子句中所有列的数据类型。使用数据类型优先规则,它观察一行中的 varchar 文字和另一行中的 int 文字,因此确定该列的整体类型为 int 并尝试执行导致错误的转换。

在此过程中,它不会使用有关要在其中放置的目标表的任何信息,包括其中列的数据类型。

关于sql - 将 varchar 值 '0%' 转换为数据类型 int 时转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44951159/

相关文章:

sql - 如何通过特定顺序检测值的变化

sql-server - 如何记录存储过程的频率和上次使用时间?

php - 在sql中添加新行

mysql - SQL 从两个表中选择(用户有最大汽车)

sql - 如何获得多列之间的2个最大值?

sql - 从子树(PostgreSQL ltree)查询中选择根节点,返回几个后代

sql-server - Entity Framework 查询结果重复

c# - Fluent NHibernate 映射到 SQL Server CHAR(10) ID 列

sql - 如何更新表中的所有行并增加一列?

mysql - 我的 pg_dump 文件去哪里了?