我在SQL Server 2012 Express 64位的所有工作中的第一名。
我试图将一个VARCHAR字段转换为十进制并乘以另一个Varchar。
这是我要在选择查询上运行的代码:
(CONVERT(decimal(12,2), COALESCE(Lineas.PARAM1, 0.00))) * (CONVERT(decimal(12,2), COALESCE(Lineas.PARAM2, 0.00))) AS 'MULTIPARAM'
其中param1和param2是varchar。该字段上的数字为1和2。太简单了。我希望它返回3.00,但显示的错误是:
男士。8114,Nivel 16,Estado 5,Línea1
错误的contrentir el Tipo deatos varch a数字。
我只想获取param1 * param2的结果,即使param1或param2为null(转换为0),或者如果它们十进制(例如,用dot分隔:100.5)
我不明白为什么它不起作用...谢谢!
找到了错误:
colesce(lineas.param1,0.00)使其失败"转换为数字";和cocece(lineas.param1,0)使其失败"将varchar'100.5'转换为int"。(无论如何这不是我的意图)
我该如何使此"工作"?
jatin的解决方案:
select(cocce(Convers(十进制(12,2),nullif(replace(lineas.param1,'',''),'),''),0.00))),nullif(替换(lineas.param2,''''),''),0.00))为'proultaram'
我要做的是首先替换所有空格,然后如果它是空字符串,则将其设置为null,静止为
尝试这个...
SELECT (COALESCE(CONVERT(decimal(12,2), Lineas.PARAM1), 0.00)) * (COALESCE(CONVERT(decimal(12,2), Lineas.PARAM2), 0.00)) AS 'MULTIPARAM'
问题在这里..
SELECT COALESCE('1', 0.00)
如果您仍然会收到错误"错误将数据类型VARCHAR转换为数字",则您的数据具有0-9以外的其他字符。
你要踢自己。
英语错误消息;
Msg 8115, Level 16, State 8, Line 12
Arithmetic overflow error converting varchar to data type numeric.
样本数据;
IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData
GO
CREATE TABLE #TestData (ID int, Field1 varchar(10), Field2 varchar(10))
INSERT INTO #TestData
VALUES
(1,1,1)
,(2,1,2)
,(3,1,3)
,(4,1,4)
,(5,2,1)
,(6,2,2)
,(7,2,3)
查询(从合并中删除小数点);
SELECT
ID
,Field1
,Field2
,(CONVERT(decimal(12,2), COALESCE(a.Field1, 0))) * (CONVERT(decimal(12,2), COALESCE(a.Field2, 0))) AS 'MULTIPARAM'
FROM #TestData a
结果;
ID Field1 Field2 MULTIPARAM
1 1 1 1.0000
2 1 2 2.0000
3 1 3 3.0000
4 1 4 4.0000
5 2 1 2.0000
6 2 2 4.0000
7 2 3 6.0000
如果您希望结果达到两个小数,则使用此;
SELECT
ID
,Field1
,Field2
,CONVERT(decimal(12,2),(CONVERT(decimal(12,2), COALESCE(a.Field1, 0))) * (CONVERT(decimal(12,2), COALESCE(a.Field2, 0)))) AS 'MULTIPARAM'
FROM #TestData a
给出这些结果;
ID Field1 Field2 MULTIPARAM
1 1 1 1.00
2 1 2 2.00
3 1 3 3.00
4 1 4 4.00
5 2 1 2.00
6 2 2 4.00
7 2 3 6.00
如果您在varchar字段中有小数,则请给它;
CONVERT(decimal(12,2),COALESCE(CAST(a.Field1 AS decimal(12,2)), 0) * COALESCE(CAST(a.Field2 AS decimal(12,0)), 0)) AS 'MULTIPARAM'