无法在sql中将varchar转换为float

无法在sql中将varchar转换为float,sql,sql-server,sql-server-2008,sql-server-2005,Sql,Sql Server,Sql Server 2008,Sql Server 2005,这是我的两张桌子 CREATE TABLE [dbo].[dailyRate]( [SYMBOL] [varchar](50) NULL, [SERIES] [varchar](50) NULL, [OPENPRICE] [varchar](50) NULL, [HIGHPRICE] [varchar](50) NULL, [LOWPRICE] [varchar](50) NULL, [CLOSEPRICE] [varchar](50) NULL, [LASTPRICE] [varchar](5

这是我的两张桌子

CREATE TABLE [dbo].[dailyRate](
[SYMBOL] [varchar](50) NULL,
[SERIES] [varchar](50) NULL,
[OPENPRICE] [varchar](50) NULL,
[HIGHPRICE] [varchar](50) NULL,
[LOWPRICE] [varchar](50) NULL,
[CLOSEPRICE] [varchar](50) NULL,
[LASTPRICE] [varchar](50) NULL,
[PREVCLOSE] [varchar](50) NULL,
[TOTTRDQTY] [varchar](50) NULL,
[TOTTRDVAL] [varchar](50) NULL,
[TIMESTAMPDAY] [varchar](50) NULL,
[TOTALTRADES] [varchar](50) NULL,
[ISIN] [varchar](50) NULL
)


CREATE TABLE [dbo].[cmpDailyRate](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[SYMBOL] [varchar](50) NULL,
[SERIES] [varchar](50) NULL,
[OPENPRICE] [decimal](18, 4) NULL,
[HIGHPRICE] [decimal](18, 4) NULL,
[LOWPRICE] [decimal](18, 4) NULL,
[CLOSEPRICE] [decimal](18, 4) NULL,
[LASTPRICE] [decimal](18, 4) NULL,
[PREVCLOSE] [decimal](18, 4) NULL,
[TOTTRDQTY] [bigint] NULL,
[TOTTRDVAL] [decimal](18, 4) NULL,
[TIMESTAMPDAY] [smalldatetime] NULL,
[TOTALTRADES] [bigint] NULL,
[ISIN] [varchar](50) NULL,
[M_Avg] [decimal](18, 4) NULL
) 
这是我的insert查询,用于通过强制转换将数据从表中提取到另一个表中

折叠|复制代码

INSERT into [Stock].[dbo].[cmpDailyRate]
SELECT [SYMBOL],[SERIES],Str([OPENPRICE], 18,4),Str([HIGHPRICE],18,4),
Str([LOWPRICE],18,4),Str([CLOSEPRICE],18,4),Str([LASTPRICE],18,4),Str([PREVCLOSE],18,4),convert(bigint,[TOTTRDQTY]),Str([TOTTRDVAL],18,4),
convert(date, [TIMESTAMPDAY], 105),convert(bigint,[TOTALTRADES]),[ISIN],null
FROM [Stock].[dbo].[DailyRate]
此查询在SQL Server 2005中运行良好,但在SQL Server 2008中会导致错误(安装时,上述查询也会在SQL Server 2008中运行;最近几天会出现错误)

错误:

错误:无法将varchar转换为float


怎么办

正在进行浮点转换(Str)的列中有一行包含无效数据。使用以下策略确定哪一个:

SELECT *
FROM [dailyRate]
WHERE IsNumeric([OPENPRICE]) = 0
OR IsNumeric([HIGHPRICE]) = 0

等等。

如果您不想过滤掉数据,案例陈述可能更适合您

SELECT CASE 
        WHEN IsNumeric([OPENPRICE]) = 1 THEN [OPENPRICE]
        ELSE NULL -- or 0 or whatever
       END AS OPENPRICE,
       CASE 
        WHEN IsNumeric([HIGHPRICE]) = 1 THEN [HIGHPRICE]
        ELSE NULL -- or 0 or whatever
       END AS [HIGHPRICE]
FROM [dailyRate]

检查数据是否存在无效值示例中没有WHERE筛选器,但我很好奇代码中是否有。如果您这样做,或者如果DailrRate被截断并重新填充,那么如果您在数据中获得无效值,则可能会出现看似随机的错误。下面的案例说明可能是更安全的方法。我确实建议使用AND而不是OR@Praveen:An,仅当同一行上的多个值不正确时才有帮助。如果任何列包含不正确的值,原始查询将失败。where和isnumeric(…)是不够的-sql可能(并且经常)在应用where条件之前转换值。大小写是数字(…)然后。。。其他的end将完成此任务。@Arvo:在OP的示例中。SQL如何将值自动转换为浮点值,并为无效值返回IsNumeric()=1?结果会是什么?对不起,我误读了一些东西(我不知怎的认为转换没有错误)。当然,只要检查无效值,isnumeric()就足够了。