Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中将负Varchar、Null转换为十进制_Sql_Sql Server_Tsql - Fatal编程技术网

在SQL Server中将负Varchar、Null转换为十进制

在SQL Server中将负Varchar、Null转换为十进制,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试将下面的一个度量列值从varchar转换为小数20,3。第三个值是一个空值,没有任何空格,为了让您理解,我用引号括起来。我试过使用CAST,但CAST无法更改数据类型,因为它有负号。但我想保持负值 我试着使用TRY_CONVERT和TRY_CAST,但并没有得到想要的结果。如果有人能帮忙,那就真的很有帮助了。我在下面试过 CAST(COALESCE((NULLIF(SalesColumn,'')),'0') AS NUMERIC(20,12)) -992.0 0 您可以在nulli

我正在尝试将下面的一个度量列值从varchar转换为小数20,3。第三个值是一个空值,没有任何空格,为了让您理解,我用引号括起来。我试过使用CAST,但CAST无法更改数据类型,因为它有负号。但我想保持负值

我试着使用TRY_CONVERT和TRY_CAST,但并没有得到想要的结果。如果有人能帮忙,那就真的很有帮助了。我在下面试过

CAST(COALESCE((NULLIF(SalesColumn,'')),'0') AS NUMERIC(20,12))

-992.0
0
您可以在nullif中添加另一个合并来处理null值。请看下面的例子

declare @var as varchar(50);
set @var=null;

select cast(COALESCE((NULLIF(coalesce(trim(@var),0),'')),'0') AS NUMERIC(20,12))
GO
dbfiddle

我使用SQL Server 2017,CAST工作正常,并保持--sign,下面是一个示例。注意舍入,在将其转换为小数20,3之前,您可能需要使用舍入,首先将其转换为精度更高的小数,然后使用舍入,然后将其转换为小数20,3

在NULL上使用CAST-to-numeric或decimal也可以很好地工作

这就是结果

---------------------------------------
-992.123
-45678.000
0.000
0.000
321.000
0.000

(6 rows affected)

请给出一个不适用于您的行或值的具体示例,以及任何错误消息、您得到的结果和您实际想要的结果。目前,该短语无法更改数据类型,因为带有负号的语句太模糊/不明确。使用带有“-992.0”的语句,我得到-992.000000000000000000-不清楚您的问题是什么,所以我希望所有这3个都加载到目标列中,其中我的数据类型是小数20,12。但是使用该语句可以像转换为-992或将NULL转换为零。但总的来说,当我试图用CAST和CONVERT将我的逻辑应用于整个专栏时,它不起作用,你不是新来的,它不起作用,这不是一个有用的评论。准确定义它的功能以及它如何不满足您的目标或期望。我们无法读懂你的心思或看到你的屏幕。是否发生错误?如果是,请发布所有错误消息。如果结果不是您期望的结果,则提供示例数据、生成的输出以及您期望的输出。建议您澄清列的数据类型,因为您使用字符串常量。将数据类型varchar转换为数字错误时出错。虽然我已经尝试了这里给出的所有解决方案,但仍然得到了这个错误。事实上,所有表达式都可以很好地处理单个值,比如只处理数字或空值。但当它试图转换为数值时,使用cast、coalesce和NULLIF,即在整个列上抛出errorcoalescetrim@var,0可以,因此在所有其他周围代码中都没有魔力。
declare @var as varchar(50);
set @var='  ';

select cast(COALESCE((NULLIF(coalesce(trim(@var),0),'')),'0') AS NUMERIC(20,12))
GO
| (No column name) | | ---------------: | | 0.000000000000 |
declare @var as varchar(50);
set @var='- 992 ';

select cast(COALESCE((NULLIF(coalesce(trim(@var),0),'')),'0') AS NUMERIC(20,12))
GO
| (No column name) | | ----------------: | | -992.000000000000 |
DECLARE 
     @Val1 VARCHAR(10) = '-992.123'
    ,@Val2 VARCHAR(10) = '-45678'
    ,@Val3 VARCHAR(10) = NULL
    ,@Val4 VARCHAR(10) = ''
    ,@Val5 VARCHAR(10) = '321'
    ,@Val6 VARCHAR(10) = ' '

SELECT ISNULL(CAST(NULLIF(A, '') as decimal(20,3)), 0)
FROM (
    VALUES (@Val1), (@Val2), (@Val3), (@Val4), (@Val5), (@Val6)
) Sub (A)
---------------------------------------
-992.123
-45678.000
0.000
0.000
321.000
0.000

(6 rows affected)