将空varchar转换为数字

时间:2013-11-29 14:45:49

标签: sql sql-server

我使用的是SQL Server 2008 R2和Microsoft SQL Server Management Studio 0.50.2500.0。

在我的存储过程中,

我正在将varchar转换为数字(18,2)。

select convert(numeric(18,2),' ')

当值为'时返回0.00,这是必需的。

但现在,它给出错误'将数据类型varchar转换为数字时出错。'

任何人都可以告诉我,我做错了什么?或者哪个改变了?

提前致谢。

8 个答案:

答案 0 :(得分:1)

有关,DECLARE @VAL1 float;

执行此语句时

select convert(numeric(18,2),(case when 2=1 then @VAL1 else @VAL end ));

Sql server在内部将@VAL转换为Floatdatatype of @VAL1),然后compare将输出显示为零。

DECLARE @VAL nvarchar(10);
DECLARE @VAL1 float;
set @VAL=' ';
set @VAL1=12.123;
select @VAL,@VAL1
select CONVERT(float,@VAL)--done by sql server internally 
select convert(numeric(18,2),(case when 2=1 then @VAL1 else @VAL end ));

但是,对于DECLARE @VAL1 numeric(18,2)

它实际上在sql server内部转换时出错。

DECLARE @VAL nvarchar(10);
DECLARE @VAL1 numeric(18,2);
set @VAL=' '; 
set @VAL1=12.123;
select @VAL,@VAL1
select CONVERT(numeric(18,2),@VAL)--at this point,sql sever unabled to convert @VAL to datatype Numeric
select convert(numeric(18,2),(case when 2=1 then @VAL1 else @VAL end ));

答案 1 :(得分:0)

不知道为什么,但试试这个它应该进一步调查为什么它会允许你这样做,如果你发现任何事情,请更新我们。

SELECT CONVERT(numeric(18,2),CAST(' ' AS INT))

结果

(No column name)
0.00

我一直在网上寻找一些只有this Link看起来仍然不太清楚这种行为的解释。

答案 2 :(得分:0)

不确定是否需要它也可以使用非空白值

Declare @myValue varchar(10)
SET @myValue = ' '

SELECT 
    CASE 
        WHEN @myValue <> ' ' THEN 
            CONVERT(numeric(18,2), @myValue) 
        ELSE '0.00' 
    END

输出0.00

Declare @myValue varchar(10)
SET @myValue = '3.2'

SELECT 
    CASE 
        WHEN @myValue <> ' ' THEN 
            CONVERT(numeric(18,2), @myValue) 
        ELSE

输出3.20

答案 3 :(得分:0)

http://blog.sqlauthority.com/2007/07/07/sql-server-convert-text-to-numbers-integer-cast-and-convert/

 SELECT CAST(YourVarcharCol AS INT) FROM Table
 SELECT CONVERT(INT, YourVarcharCol) FROM Table

答案 4 :(得分:0)

全部谢谢!!

我找到了根本原因。我已将列数据类型 float 更改为数字,这与转换后的值有关。

例如,

DECLARE @VAL nvarchar(10);
DECLARE @VAL1 float;
set @VAL=' ';
set @VAL1=12.123;
select convert(numeric(18,2),(case when 2=1 then @VAL1 else @VAL end ));

结果

0.00

将@ VAL1数据类型更改为数字

DECLARE @VAL nvarchar(10);
DECLARE @VAL1 numeric(18,2);
set @VAL=' '; 
set @VAL1=12.123;
select convert(numeric(18,2),(case when 2=1 then @VAL1 else @VAL end ));

导致错误,'将数据类型nvarchar转换为数字'时出错。

如果有人解释这里真的发生了什么,将会受到欢迎。

答案 5 :(得分:0)

declare @value varchar(10)=''

select case when ISNUMERIC(@value)=1 then convert(numeric(18,2),@value) else convert(numeric(18,2),0) end

因此,如果@value =''结果为0.00。也可以说,如果值为6,则结果为6.00

答案 6 :(得分:0)

嗨,请看看试试这个

declare @xx as varchar(10)
set @xx = ''

select case when @xx ='' then convert(numeric(18,2),'0.00') 
       else convert(numeric(18,2),@xx) end as test

由于

答案 7 :(得分:0)

使用 TRY_PARSE ( string_value AS data_type [ 使用文化 ] ) 在你的情况下: 选择 TRY_PARSE(' ' as NUMERIC)

备注: 仅将 TRY_PARSE 用于从字符串转换为日期/时间和数字类型。对于一般类型转换,继续使用 CAST 或 CONVERT。请记住,解析字符串值有一定的性能开销。

TRY_PARSE 依赖于 .NET Framework 公共语言运行时 (CLR) 的存在。