SQL中将nvarchar列转为decimal(18,2)遇'full'值报错求解
解决nvarchar转decimal时含非数字值的转换错误
你遇到的问题是因为SQL在执行转换时,会优先尝试将所有nvarchar值转为numeric类型,哪怕你用CASE做了条件判断,优化器的执行顺序可能导致非数字值(比如'full')触发转换失败报错。以下是几种可靠的解决方案:
方案1:用TRY_CONVERT处理(推荐,SQL Server 2012+)
TRY_CONVERT会尝试转换值,失败时返回NULL,不会抛出错误。结合CASE先替换'full'为目标数值:
CREATE VIEW YourViewName AS SELECT CASE WHEN YourColumnName = 'full' THEN CAST(1222.00 AS decimal(18,2)) ELSE TRY_CONVERT(decimal(18,2), YourColumnName) END AS ConvertedDecimalColumn FROM YourTableName;
如果需要对其他非数字值设置默认值(比如0.00),可以用ISNULL包裹:
CREATE VIEW YourViewName AS SELECT ISNULL( CASE WHEN YourColumnName = 'full' THEN CAST(1222.00 AS decimal(18,2)) ELSE TRY_CONVERT(decimal(18,2), YourColumnName) END, 0.00 ) AS ConvertedDecimalColumn FROM YourTableName;
方案2:兼容SQL Server 2008及更早版本
如果你的版本不支持TRY_CONVERT,可以用ISNUMERIC判断值是否为合法数字,再结合CASE处理:
CREATE VIEW YourViewName AS SELECT CASE WHEN YourColumnName = 'full' THEN CAST(1222.00 AS decimal(18,2)) WHEN ISNUMERIC(YourColumnName) = 1 THEN CAST(YourColumnName AS decimal(18,2)) ELSE 0.00 -- 可自定义非数字值的默认返回值 END AS ConvertedDecimalColumn FROM YourTableName;
注意:ISNUMERIC存在一定局限性,比如会把'123.'、'.123'这类视为合法数字,若你的数据有这类场景,需要额外处理。
核心逻辑说明
先通过CASE将特定非数字值('full')替换为目标数值的decimal类型,再对剩余值进行安全转换,确保SQL不会尝试转换不符合要求的字符串,从而避免Error converting data type nvarchar to numeric错误。
内容的提问来源于stack exchange,提问作者Regazzi
相关产品推荐
相关产品推荐

