Tsql 当VARCHAR包含小数时,您可以';我不能把它转换成整数——为什么?

Tsql 当VARCHAR包含小数时,您可以';我不能把它转换成整数——为什么?,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我在尝试将varchar强制转换为int时遇到了一个SQL代码问题。下面是一个Transact-SQL代码段,演示了该问题 declare @code varchar(100), @retCode smallint, @intCode int select @retCode = 0, @code = '1.0000 ' select @intCode = convert(int, LTR

我在尝试将varchar强制转换为int时遇到了一个SQL代码问题。下面是一个Transact-SQL代码段,演示了该问题

declare     @code       varchar(100),
            @retCode    smallint,
            @intCode    int

select @retCode =   0, @code = '1.0000            '

select @intCode = convert(int, LTRIM(RTRIM(@code)))
您将得到以下错误:

Msg 245,第16级,状态1,第9行
将varchar值“1.0000”转换为数据类型int时,转换失败

显然,
convert
(和
cast
)无法将
varchar
十进制值直接转换为
int

我不得不这样做来纠正它

declare @code       varchar(100),
    @retCode    smallint,
    @intCode    decimal

select @retCode =   0, @code = '1.0000            '

select @intCode = convert(int, (convert(decimal, LTRIM(RTRIM(@code)))))
select @intCode
那么,为什么上面的更正有效--
varchar->decimal->int
?为什么我不能直接从
varchar
转换到
int
,而不管它的数值是多少?我想了解这背后的原因。(忽略上面的LTRIM/RTRIM…这是不必要的)

顺便说一下,我使用的是SQLServer2008R2


多谢

基本上,SQL Server不确定您正在尝试哪种类型的转换

通过直接指定变量,可以隐式转换为int:

SET @intcode = @Code -- This will Truncate the decimal portion of the number
或者,您可以使用以下命令在SQL Server 2008中执行显式转换:

像这样:

select @intCode = convert( int, try_convert( decimal, @code )  )
不管怎样,您都没有进行字符串操作

下面是一个关于简单谈话中隐式与显式转换的很好的解释:


干杯

如果所述代码是在如下逻辑的情况下工作的:--SNIP SNIP--where(code_type='AGE'和AGE>=CASE WHEN dbo.fnIsNumeric(beging_cd)=1,然后转换(int,(convert(decimal,beging_cd)))else 0 end and age在使用CASE语句时,我使用try_convert而不是convert。这是一个替换中的下降…小数位数不重要。我们希望将其删除(只需一个int即可)。