我使用的是SQL Server 2008 R2和Microsoft SQL Server Management Studio 0.50.2500.0。
在我的存储过程中,
我正在将varchar转换为数字(18,2)。
select convert(numeric(18,2),' ')
当值为'时返回0.00,这是必需的。
但现在,它给出错误'将数据类型varchar转换为数字时出错。'
任何人都可以告诉我,我做错了什么?或者哪个改变了?
提前致谢。
答案 0 :(得分:1)
有关,DECLARE @VAL1 float;
,
select convert(numeric(18,2),(case when 2=1 then @VAL1 else @VAL end ));
Sql server在内部将@VAL
转换为Float
(datatype 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) 的存在。