我正在使用SQL Server 2008 r2。有31个字段(D1-D31)作为varchar,并保留2个格式数据作为数字和文本,如'SD'和'123.456'。
我像这样使用Crystal Report的Data Base Expert命令。
select
case
when D1 in('SD') then d1
when D1 is NULL then ''
else convert(decimal(7,2),d1)
end
.
.
.
case D2-D31
from Rec2019 where ID ='P0009'
它显示将数据类型varchar转换为数字时出错。怎么解决?请..
列具有一种数据类型,因此您不能将DECIMAL和VARCHAR值放在同一列中。我想你想要舍入数字值。在这种情况下,您可以使用以下内容:
CASE
WHEN ISNUMERIC(d1) = 1 AND d1 NOT IN ('+', '-', '$') THEN CAST(CAST(d1 AS DECIMAL(7, 2)) AS VARCHAR(9))
WHEN d1 IS NULL THEN ''
ELSE d1
END
对于SQL Server 2008
,您可以使用ISNUMERIC
进行检查,其中SQL Server 2012+具有TRY_CONVERT
或TRY_CAST
,使其简单如下。
TRY_CONVERT(decimal(7,2), D1)
由于ISNUMERIC有一些小的缺点,例如数字的科学记法,我会使用TRY_CAST,如下所示:(注意:SQLServer 2012+)
CREATE TABLE #T (ColA VARCHAR (10))
INSERT INTO #T VALUES ('1'), ('A'), ('2');
SELECT *, TRY_CAST (ColA AS DECIMAL (4,2)) AS Numb
FROM #T
旁注:一列有一个数据类型,您无法在SQL Server的一列中组合数据类型。
要在数据为数字时进行转换,而在数据为文本时不进行转换,则可以使用isnumeric函数检查类型。
select
case when isnumeric(D1) then convert(decimal(7,2), D1) else null end as D1_asnumeric
from XXX