我正在尝试将从varchar继承的一些数据转换为float:
SELECT CAST([Column 8] AS Int) FROM [Sean].[dbo].[ResApr2019]
我收到此错误:
将varchar值'14,714.000'转换为数据类型int时,消息245,级别16,状态1,第2行转换失败。
有什么想法可以解决这个问题吗?
谢谢
答案 0 :(得分:4)
从文本中删除',',尝试将其转换为十进制,然后转换为整数值。
SELECT CONVERT(decimal(11,0), REPLACE('14,714.000', ',', ''))
以您的情况
SELECT CONVERT(decimal(11,0),REPLACE([Column 8],',','')) FROM [Sean].[dbo].[ResApr2019]
OR
SELECT CONVERT(float,REPLACE([Column 8],',','')) FROM [Sean].[dbo].[ResApr2019]
答案 1 :(得分:1)
您需要修复您的数据类型。 varchar
不是数字数据类型,不应用于存储数字值。这就是为什么出现错误的原因,因为数值数据类型不包含逗号。您可以使用以下语句来修复表(假设它们全部为%,0.000
格式):
USE Sean;
GO
UPDATE TABLE dbo.ResApr2019
SET [LENGTH] = REPLACE([Column 8],',','');
ALTER TABLE A ALTER COLUMN [Column 8] int; --Other datatype with a scale/precision may be appropriate (like decimal)
然后,您可以运行查询而无需CAST
:
SELECT [Column 8]
FROM [Sean].[dbo].[ResApr2019];
答案 2 :(得分:1)
使用Money
数据类型代替float
。 money
将处理逗号分隔的数字。
select cast([Column 8] as money) from [sean].[dbo].[ResApr2019]
答案 3 :(得分:0)
您的代码由于字符串中的逗号和点而失败。您想在转换为INT之前消除这些字符
DECLARE @A VARCHAR(10) = '14,714.000'
DECLARE @B VARCHAR(20)
SET @B = REPLACE(REPLACE(@A, ',', ''), '.', '')
SELECT CAST(@A AS INT)--This code fails
SELECT CAST(@B AS INT)--This code works well
在您的情况下:
SELECT CAST(REPLACE(REPLACE([Column 8],',',''),'.','') AS Int) FROM [Sean].[dbo].[ResApr2019]
答案 4 :(得分:0)
问题似乎是varchar值中的逗号。通过在进行转换或转换之前将其剥离,可以解决该问题。您是否有机会从另一台服务器上的备份本地还原此数据库?可能是本地计算机上的“区域”设置与服务器上的区域设置不同的情况。
declare @test varchar(50) = replace('14,714.000 ', ',', '');
select @test;
select cast(@test as float)
select convert(float, @test)