2017-05-09 63 views
2

我想将nvarchar(255)数据类型转换为货币,并且出现此错误消息:“无法将char值转换为货币,char值的语法不正确。nvarchar和货币之间的SQL转换问题

我在Stockoverflow上发现了几件事情,表明我在波纹管格式中添加了isNull,但我仍然收到相同的错误。

SUM(isnull(cast(tbl_ALL_DATA_REPORT.[30_days_ago_sales] as money),0)) AS SumOf30_Days_Ago, 

任何想法我可能在这里做错了吗?

enter image description here

+0

我会远离实际的金钱类型。以下是有效数据转换类型的图表。 https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine –

+0

你还可以提供一些你正试图转换的数据的例子吗? –

+0

@ Jacob H - 我拍了几行的快照。我希望你能看到它。所以我有NULL值,我有10535.950000001或520.190000000005等 – Slavisha

回答

0

一些值无效字符,它..你可以尝试使用try_cast

declare @n nvarchar(50) = '50n.25' 
select isnull(try_cast(@n as money), 0) 

在您的方案

SUM(isnull(try_cast(tbl_ALL_DATA_REPORT.[30_days_ago_sales] as money),0)) AS SumOf30_Days_Ago, 
0

试试这个,你ISNULL内CAST:

SUM(cast(ISNULL(tbl_ALL_DATA_REPORT.[30_days_ago_sales],0) as DECIMAL(19,12))) AS SumOf30_Days_Ago, 

此外,我将您的MONEY更改为DECIMAL,因为MONEY最多有5个小数位。

+0

@Jackob H - 我试过这个,我得到:“将数据类型nvarchar转换为数字时出错。 – Slavisha

+0

我会说试试用一个值。它可能与数据有关。 –

0

您很可能会将无效字符或非数字作为无法转换的数据集的一部分。检查数据实际上是“数字”之前作出这样的假设:

DECLARE @X TABLE (val VARCHAR(8)); 

INSERT INTO @X (val) VALUES (NULL), ('abc'),('4'),('%&Crazy') 

Select 
    val AS ASIS 
, ISNULL(val, 0) AS firstCastWillWorkForNullsNotMuchElse 
, CASE WHEN ISNUMERIC(ISNULL(val, 0)) <> 0 THEN ISNULL(val, 0) ELSE 0 END AS secondCastToCheckNumeric 
, CAST(CASE WHEN ISNUMERIC(ISNULL(val, 0)) <> 0 THEN ISNULL(val, 0) ELSE 0 END AS MONEY) AS thirdCastDoesItAll 
From @X