【问题标题】:Showing converting error for varchar to numeric显示 varchar 到数字的转换错误
【发布时间】:2017-11-17 15:12:30
【问题描述】:

我收到了这个错误

消息 8114,第 16 级,状态 5,第 13 行
将数据类型 varchar 转换为数值时出错。

这是我的代码:

SELECT DISTINCT  
                      DI.DealName AS 'Deal Name',  
    DI.OfferingType AS 'Offering Type',   
    DI.Date AS 'Date',  
    DI.ClassName AS 'Class',  
    ISNULL(Bench,'-') AS 'BM',  
    ISNULL(Guidance,'-') AS 'Guid',  
    DI.Industry AS 'Industry',  
    CAST( (ISNULL(DI.AverageLife,0)) AS VARCHAR(20)) AS 'WAL',CAST(  ISNULL(DI.ClassSize,0) AS VARCHAR(20)) AS 'Balance',CAST(   REPLACE(ISNULL(DI.Coupon,0),'%','') AS VARCHAR(20)) AS 'Coupon',  
       CAST(  CASE WHEN CAST(REPLACE(ISNULL(DI.PX2,0),'%','') AS DECIMAL(18,5)) = 0.00 THEN (CASE WHEN ISNULL(CAST(DI.Yield * 100 AS DECIMAL(18,3)),0) = 0 THEN (CASE WHEN (ISNULL(DI.Coupon,0)+'cpn' = 'cpn' OR ISNULL(DI.Coupon,0)+'cpn' = '0cpn') THEN '-' ELSE (ISNULL(DI.Coupon,0)+'cpn')END)ELSE CAST(ISNULL(CAST(DI.Yield * 100 AS DECIMAL(18,3)),0) AS VARCHAR(15))+'%yld' END) ELSE (ISNULL(DI.PX,0)) END AS VARCHAR(20)) AS 'Spread',  CAST(  ISNULL(CAST(DI.Yield * 100 AS DECIMAL(18,3)),0) AS VARCHAR(20)) AS 'Yield', CAST(  CASE WHEN LTRIM(RTRIM(DI.Dollar_Px)) = '' THEN 0.00 ELSE CAST(ISNULL(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(Dollar_Px)),CHAR(10),''),CHAR(13),''),'-',''),'/',''),' ',''),'%cpn',''),0) AS DECIMAL(18,5)) END AS VARCHAR(20)) AS 'Dollar_Px',  ISNULL(Notes,'') AS Notes,                 
           CAST((FRM.Rating + '/' + KBRARM.Rating) AS VARCHAR(15)) AS 'Rating'  FROM DI_DealIssuancePost DI  
         INNER JOIN DI_CompanyRatingMapping MRM ON MRM.CompanyRatingMappingID = DI.Mdy                   INNER JOIN DI_CompanyRatingMapping SPRM ON SPRM.CompanyRatingMappingID = DI.S_P  
         INNER JOIN DI_CompanyRatingMapping FRM ON FRM.CompanyRatingMappingID = DI.Fitch  
         INNER JOIN DI_CompanyRatingMapping DBRSRM ON DBRSRM.CompanyRatingMappingID = DI.DBRS                 INNER JOIN DI_CompanyRatingMapping KBRARM ON KBRARM.CompanyRatingMappingID = DI.KBRA  

         INNER JOIN DI_WeeklySectors DIWeekly ON DI.Industry = DIWeekly.Sector  

        WHERE DI.IsDeleted = 0              
          AND MRM.IsDeleted = 0  
          AND SPRM.IsDeleted = 0  
          AND FRM.IsDeleted = 0  
          AND DBRSRM.IsDeleted = 0  
          AND KBRARM.IsDeleted = 0  
          AND DI.Date IS NOT NULL   
          AND (CONVERT(DATETIME,DI.Date ,101) >= CONVERT(DATETIME,@StartDate,101))   
          AND (CONVERT(DATETIME,DI.Date ,101) <= CONVERT(DATETIME,@EndDate,101)) AND DI.CurrencyID IN (SELECT * FROM CsvToTable(@Currency)) ORDER BY DI.Date desc

消息 8114,第 16 级,状态 5,第 13 行 将数据类型 varchar 转换为数值时出错。

我可以发现这是一个错误

 CAST(  CASE WHEN CAST(REPLACE(ISNULL(DI.PX2,0),'%','') AS DECIMAL(18,5)) = 0.00 THEN (CASE WHEN ISNULL(CAST(DI.Yield * 100 AS DECIMAL(18,3)),0) = 0 THEN (CASE WHEN (ISNULL(DI.Coupon,0)+'cpn' = 'cpn' OR ISNULL(DI.Coupon,0)+'cpn' = '0cpn') THEN '-' ELSE (ISNULL(DI.Coupon,0)+'cpn')END)ELSE CAST(ISNULL(CAST(DI.Yield * 100 AS DECIMAL(18,3)),0) AS VARCHAR(15))+'%yld' END) ELSE (ISNULL(DI.PX,0)) END AS VARCHAR(20)) AS 'Spread',  CAST(  ISNULL(CAST(DI.Yield * 100 AS DECIMAL(18,3)),0) AS VARCHAR(20)) AS 'Yield', CAST(  CASE WHEN LTRIM(RTRIM(DI.Dollar_Px)) = '' THEN 0.00 ELSE CAST(ISNULL(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(Dollar_Px)),CHAR(10),''),CHAR(13),''),'-',''),'/',''),' ',''),'%cpn',''),0) AS DECIMAL(18,5)) END AS VARCHAR(20)) AS 'Dollar_Px',  ISNULL(Notes,'') AS Notes,

有人帮助解决这个错误

【问题讨论】:

  • 标记您正在使用的 dbms。该代码是特定于产品的。
  • 我很抱歉,我无法通过完整的代码
  • 微软 sql server 2014
  • 错误信息说明了一切。您正在尝试将非数字 varchar 值转换为数字数据类型。
  • 我应该发送完整代码@jarlh

标签: sql sql-server sql-server-2008 asp.net-mvc-4 stored-procedures


【解决方案1】:

下面一一检查:

SELECT ISNUMERIC(ISNULL(DI.PX2,0)) FROM DI WHERE ISNUMERIC(ISNULL(DI.PX2,0)) = 0

SELECT ISNUMERIC(ISNULL(DI.Yield,0)) FROM DI WHERE ISNUMERIC(ISNULL(DI.Yield,0)) = 0

SELECT ISNUMERIC(ISNULL(Dollar_Px,0)) FROM TABLE WHERE ISNUMERIC(ISNULL(Dollar_Px,0)) = 0

必须存在任何无法转换为decimalvarchar字符串

【讨论】:

    【解决方案2】:

    这是一个错误:

    (ISNULL(DI.Coupon,0)+''cpn'' = ''cpn'' OR ISNULL(DI.Coupon,0)+''cpn'' = ''0c
    
    pn'') THEN
    

    您的优惠券是 varchar,但如果是 NULL,则使用 0 代替它。 您应该在您的'0cpn' 中使用'0',因为它是字符串,而不是整数。

    应该是这样的

    (ISNULL(DI.Coupon,''0'')+''cpn'' = ''cpn'' OR ISNULL(DI.Coupon,''0'')+''cpn'' = ''0c
    
    pn'') THEN
    

    【讨论】:

    • 你告诉我的改变是什么,我尝试过但又抛出错误。
    猜你喜欢
    • 2014-07-31
    • 2013-12-09
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多