2017-07-06 144 views
2

我正面临SQL Server的问题。将varchar值“0%”转换为数据类型int时发生转换失败int

我创建了一个表是这样的:

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值?

+1

您的代码适用于SQL Server 2014中的我。http://rextester.com/UOOT87695您确定它是刚刚创建的同一张表吗?相同的模式等? –

+0

我正在使用SQL Server Express 2012,但是,我有“使用mydb;”声明在文件的开头。编辑:我试图为创建和插入查询添加表示法[schema]。[表],但我得到的结果与以前一样... – jjhorn

+0

如果您运行SQL跟踪(或使用https:// hibernatingrhinos.com/products/nhprof)通过线路传递的实际SQL是什么? – mjwills

回答

2

什么是从你的问题缺少的就是你的不仅仅是你出的两个values线多了,其他的人的一个具有整字面值为descr列,而不是字符串。

该示例产生同样的错误:

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

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

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

+0

你是绝对正确的! !!在第二列中有一个没有引号的值'100',大约是第436个插入的元组,可能是我的sql自动代码生成器中的一个错误,但更重要的是,我学习了这个重要概念'在这个过程中,它不会使用任何有关将要放置值的目标表的信息,包括列的数据类型。“感谢大家的支持,问题解决了! – jjhorn

1

运行此操作并验证数据类型;

sp_columns Components 

貌似“DESCR”确实是一个整数

+0

令人惊讶的'descr'是一个varchar(50)... – jjhorn

相关问题