Sql Msg 8114,16级,状态5,第3行:将数据类型nvarchar转换为浮点时出错

Sql Msg 8114,16级,状态5,第3行:将数据类型nvarchar转换为浮点时出错,sql,sql-server,Sql,Sql Server,我已经这样做了好几天了,尽管我已经尝试了从nvarchar到float的不同数据类型转换,但仍然出现了这个错误。。我无法更新表的数据类型,因为我刚刚使用了数据库 SELECT DISTINCT [FIELD1] CODE , 'TPZPC-' + [FIELD30] + '-' + [FIELD2] AS "TP_ID" ,[FIELD30] CUSTOMER_CODE ,[FIELD2] SHIP ,[FIELD4] CUSTOMER_NAME

我已经这样做了好几天了,尽管我已经尝试了从nvarchar到float的不同数据类型转换,但仍然出现了这个错误。。我无法更新表的数据类型,因为我刚刚使用了数据库

SELECT DISTINCT
   [FIELD1]  CODE
  , 'TPZPC-' + [FIELD30] + '-' + [FIELD2] AS "TP_ID"
  ,[FIELD30] CUSTOMER_CODE
  ,[FIELD2]  SHIP
  ,[FIELD4]  CUSTOMER_NAME
  ,[FIELD7]  CUSTOMER_ADDRESS
  ,[FIELD8]  CUSTOMER_ADDRESS2
  ,[FIELD9]   
  , B.PROVINCE  
  , B.CITY    
  , B.REGION
  , B.CUSTOMER_CLASS
  ,[FIELD14]  QUANTITY_ORDERED
  , CASE WHEN [FIELD35] =1
         THEN [FIELD15] * -1
         ELSE [FIELD46] 
    END  AS QUANTITY_SHIPPED
  ,[FIELD41]  SELLING_UOM
  , CASE WHEN [FIELD35] =1
         THEN [FIELD42] *-1
         ELSE [FIELD42] 
    END  AS SALES_AMOUNT
  ,[FIELD44]  PD_CODE
  ,[FIELD20]  DETAILMAN_CODE
  , CASE WHEN [FIELD46] LIKE '%-' 
        THEN -(CAST(REPLACE([FIELD46],'-','') AS FLOAT))  
        ELSE   CAST([FIELD46] AS FLOAT) 
    END  AS FINANCIAL_TRADE_DISCOUNT
  , CASE WHEN [FIELD35] =1
         THEN [FIELD25] * -1
         ELSE [FIELD25] 
    END  AS NET_AMOUNT
  ,[FIELD51]  GROSSSALESVATEX
  ,B.CUSTOMER_GROUP
  ,B.COMBINEDNAME   
  , CASE WHEN  [FIELD35] = 2
         THEN  0
         ELSE  ROUND((CAST( [FIELD46] AS FLOAT ) /1.12 ) * [FIELD14],2) 
    END  AS TRADEDISCOUNT
  , CASE WHEN  [FIELD35] = 2
         THEN  0
         ELSE  ROUND((CAST( [FIELD14]*[FIELD16] AS FLOAT  ) /1.12) ,2) 
    END  AS GROSS_SALES_VATEX
    FROM  DAILYSALES  A
    LEFT JOIN DIST_CUSTOMERS B
    ON 'TP' + [FIELD30] + '-' + [FIELD2]  = B.TP_ID
    AND A.FIELD30 = B.CUSTOMER_CODE
    AND A.FIELD2 = B.SHIP_TO_CODE
    AND B.CUSTOMER_GROUP NOT LIKE '%.%'

您需要简化代码以隔离问题。可能是由于一个显式转换。但是,隐式转换也可能出现类似的错误

如果显式转换导致错误,您可以将其替换为
try\u convert()
try\u cast()
。例如:

TRY_CAST(REPLACE([FIELD46], '-', '') AS FLOAT)
如果要进一步调查,请确定转换失败的位置。对要显式转换的每个列重复此操作:

select x.*
from x -- whatever is the right table
where try_convert(float, field46) is null and field46 is not null

这可能会让问题变得显而易见。或者,您可以使用更简单的查询和示例数据提出新问题。

列字段中的值是多少?尝试从值中替换逗号。。类似于“REPLACE([FIELD46],,,,,”)的值是与453-,3-…相反的负数。。我只是先把负号移到前面,然后把它转换成float,这样我就可以处理数据。FIELD46的数据类型是nArchary。当你试图转换成float时,你需要将“-”替换成所有字段!。。例如,line:ROUND((将([FIELD46],'-','')转换为FLOAT)/1.12)尝试使用
CONCAT()
进行连接,而不是
+
。此外,您真的想要
FLOAT
,这是一种不精确的数据类型吗?
十进制
几乎总是更好。