Kev*_*ock 3 t-sql sql-server sql-server-2000 data-conversion
我有一个SQL Server 2000数据库,其列为VARCHAR(255)类型.所有数据都是NULL或具有最多两个精度点的数字数据(例如'11 .85').我试图运行以下T-SQL查询但收到错误'错误将数据类型varchar转换为数字'
SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];
Run Code Online (Sandbox Code Playgroud)
我尝试了一个更具体的演员,也失败了.
SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下内容来查看是否有任何数据是非数字的,并且返回的唯一值是NULL.
SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;
Run Code Online (Sandbox Code Playgroud)
我试图转换为其他数据类型,例如FLOAT和MONEY,但只有MONEY成功.所以我尝试了以下方法:
SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];
Run Code Online (Sandbox Code Playgroud)
......工作得很好.原始查询失败的任何想法?如果我先转换为MONEY然后再转换为DECIMAL,是否会出现问题?
谢谢!
And*_*mar 17
这可能取决于十进制符号是逗号还是点.以下是一些测试查询及其结果:
select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1
Run Code Online (Sandbox Code Playgroud)
ISNUMERIC的文档说:
当输入表达式求值为有效整数,浮点数,货币或小数类型时,ISNUMERIC返回1; 否则返回0
双方3.6并3,6可以转换为money,所以这就是为什么isnumeric('3,6')回报1.
要解决此问题,请用逗号替换逗号(如果系统使用逗号作为小数符号,则反之亦然):
select cast(replace('3,6',',','.') as decimal)
Run Code Online (Sandbox Code Playgroud)
另一种选择是在Windows中更改"十进制符号".它位于配置面板 - >区域和语言 - >格式 - >其他设置 - >数字.
| 归档时间: |
|
| 查看次数: |
36770 次 |
| 最近记录: |