C# 如何在SQL Server查询中将varchar转换为十进制?

C# 如何在SQL Server查询中将varchar转换为十进制?,c#,mysql,sql,.net,C#,Mysql,Sql,.net,在我的数据库中,我给了CHARGECODE和CHARGECODE\u emergency列一个varchar数据类型和长度15 然而,为了打盹,我需要两个数据变成小数 大多数价值观​​例如(40或55)。但也有44.00和-450 所以我试着用CAST和convert转换它们 string cmdText = @"SELECT SUM(CASE WHEN TEST_URGENT = 'T' THEN CAST(CHARGECODE_URGENT AS decimal) ELSE CAST(CHA

在我的数据库中,我给了
CHARGECODE
CHARGECODE\u emergency
列一个
varchar
数据类型和长度15

然而,为了打盹,我需要两个数据变成小数

大多数价值观​​例如(40或55)。但也有44.00和-450

所以我试着用CAST和convert转换它们

string cmdText = @"SELECT SUM(CASE WHEN TEST_URGENT = 'T' THEN CAST(CHARGECODE_URGENT AS decimal) ELSE CAST(CHARGECODE AS decimal) END) AS Somme FROM  JOB_HEADER";
我还尝试:

 string cmdText = @"SELECT SUM(CASE WHEN TEST_URGENT = 'T' THEN CONVERT(decimal, CHARGECODE_URGENT) ELSE CONVERT(decimal,CHARGECODE) END) AS Somme FROM  JOB_HEADER";
我仍然得到这个错误:

System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常

其他信息:将数据类型varchar转换为数字时出错

然而,我检查了转换是否可行,似乎是这样。所以我想我有一个语法问题。感谢您的帮助

使用
TRY\u CAST()
TRY\u CONVERT()

要查找错误值,可以执行以下操作:

select CHARGECODE_URGENT
from job_header
where try_cast(CHARGECODE_URGENT as decimal) is null and
      test_urgent = 'T';
以及:

选择CHARGECODE
从作业单元标题
其中try_cast(CHARGECODE为十进制)为null,并且
测试“T”;
使用
TRY\u CAST()
TRY\u CONVERT()

要查找错误值,可以执行以下操作:

select CHARGECODE_URGENT
from job_header
where try_cast(CHARGECODE_URGENT as decimal) is null and
      test_urgent = 'T';
以及:

选择CHARGECODE
从作业单元标题
其中try_cast(CHARGECODE为十进制)为null,并且
测试“T”;

如果您首先想要一个
十进制
,为什么要使用
varchar
?Gordon下面回答的理由是,当tets\u urgent=T时,至少有一个值不适合转换为十进制。它要么有文本,要么是“空白”@stickybit我是实习生不是“我的数据库”。我使用无法编辑的数据库。数据有多干净?您必须确保表中存储的所有值都有效,并且可以强制转换,否则会得到例外。也许你可以给我们看一些数据。如果你想要一个
decimal
,为什么首先要使用
varchar
?Gordon下面回答的理由是,当tets\u urgent=T时,至少有一个值不适合转换为decimal。它要么有文本,要么是“空白”@stickybit我是实习生不是“我的数据库”。我使用无法编辑的数据库。数据有多干净?您必须确保表中存储的所有值都有效,并且可以强制转换,否则会得到例外。也许您可以向我们显示一些数据。我收到一个新错误:“TRY\u CAST”不是可识别的内置函数名。我如何对这两个查询求和?我收到一个新错误:“TRY\u CAST”不是可识别的内置函数名。我如何对这两个查询求和?
select CHARGECODE
from job_header
where try_cast(CHARGECODE as decimal) is null and
      test_urgent <> 'T';