【问题标题】:Conversion failed when converting the varchar value '.' to data type int转换 varchar 值 '.' 时转换失败数据类型 int
【发布时间】:2020-06-25 05:17:32
【问题描述】:

我有一个查询如下:

SELECT activity_code, 
       activity_name, 
       Count(*) 
       Total_Response, 
       yearnumber, 
       Cast(Avg(Cast(Isnull([response], 0) AS NUMERIC)) AS DECIMAL(10, 2)) 
       [Ratings] 
FROM   (SELECT code         [Activity_Code], 
               activityname [Activity_Name], 
               enddt.yearnumber, 
               CASE 
                 WHEN Isnumeric(asmt.userresponse) = 1 THEN asmt.userresponse 
                 ELSE 0 
               END          [Response] 
        FROM   (SELECT userid, 
                       questionid, 
                       activityid, 
                       attemptenddateid, 
                       CASE 
                         WHEN Isnumeric(userresponse) = 1 THEN userresponse 
                         ELSE '0' 
                       END AS UserResponse 
                FROM   factassessment) asmt 
               INNER JOIN dimuser usr 
                       ON usr.id = asmt.userid 
               INNER JOIN (SELECT 
                                               id, 
                                  Cast(questionidentifier AS VARCHAR(1000)) AS 
                                               QuestionIdentifier 
                           FROM   dimquestion) ques 
                       ON ques.id = asmt.questionid 
               INNER JOIN dimactivity act 
                       ON act.id = asmt.activityid 
               INNER JOIN dimdate enddt 
                       ON enddt.dateid = asmt.attemptenddateid 
        WHERE  ( act.code LIKE 'U-%' 
                  OR act.code LIKE 'CC-%' ) 
               AND usr.empcntry <> 'administrator' 
               AND enddt.yearnumber IN ( 2015, 2016, 2017, 2018, 
                                         2019, 2020, 2021, 2021, 2022 ) 
               AND ques.questionidentifier = 'course_content' 
               AND asmt.userresponse NOT IN ( '0', '-1' )) tab 
GROUP  BY activity_code, 
          activity_name, 
          yearnumber 
ORDER  BY activity_code 

在执行上述代码时,我收到以下错误:

[SQLServer]转换 varchar 值 '.' 时转换失败到 数据类型 int。

我尝试如下修复它,但仍然遇到相同的错误:

SELECT activity_code, 
       activity_name, 
       Count(*) 
       Total_Response, 
       yearnumber, 
       Cast(Avg(Cast(Isnull([response], 0) AS NUMERIC)) AS DECIMAL(10, 2)) 
       [Ratings] 
FROM   (SELECT code         [Activity_Code], 
               activityname [Activity_Name], 
               enddt.yearnumber, 
               CASE 
                 WHEN Isnumeric(asmt.userresponse + 'e0') = 1 THEN 
                 asmt.userresponse 
                 ELSE 0 
               END          [Response] 
        FROM   (SELECT userid, 
                       questionid, 
                       activityid, 
                       attemptenddateid, 
                       CASE 
                         WHEN Isnumeric(userresponse + 'e0') = 1 THEN 
                         userresponse 
                         ELSE '0' 
                       END AS UserResponse 
                FROM   factassessment) asmt 
               INNER JOIN dimuser usr 
                       ON usr.id = asmt.userid 
               INNER JOIN (SELECT 
                                               id, 
                                  Cast(questionidentifier AS VARCHAR(1000)) AS 
                                               QuestionIdentifier 
                           FROM   dimquestion) ques 
                       ON ques.id = asmt.questionid 
               INNER JOIN dimactivity act 
                       ON act.id = asmt.activityid 
               INNER JOIN dimdate enddt 
                       ON enddt.dateid = asmt.attemptenddateid 
        WHERE  ( act.code LIKE 'U-%' 
                  OR act.code LIKE 'CC-%' ) 
               AND usr.empcntry <> 'administrator' 
               AND enddt.yearnumber IN ( 2015, 2016, 2017, 2018, 
                                         2019, 2020, 2021, 2021, 2022 ) 
               AND ques.questionidentifier = 'course_content' 
               AND asmt.userresponse NOT IN ( '0', '-1' )) tab 
GROUP  BY activity_code, 
          activity_name, 
          yearnumber 
ORDER  BY activity_code 


我仍然遇到同样的错误。帮助解决此转换错误。

【问题讨论】:

    标签: sql sql-server database type-conversion


    【解决方案1】:

    如果我对这个问题的理解正确的话,这个错误的原因可以简化为如下语句,返回Conversion failed when converting the varchar value '.' to data type int.错误:

    SELECT CASE WHEN ISNUMERIC(asmt.UserResponse) = 1 THEN asmt.UserResponse else 0 END [Response]
    FROM (
        SELECT CASE WHEN ISNUMERIC('.') = 1 THEN '.' ELSE '0' END AS UserResponse
    ) asmt
    

    最好考虑以下几点:

    • ISNUMERIC('.') 的结果是1,内部CASE 的结果是文本.。但是,外部CASE 失败,因为CASE 语句中的return type 是结果表达式中类型集中的最高优先级类型,因此在这种情况下. 被隐式转换为int
    • 不要相信ISNUMERIC() 函数。请改用TRY_CONVERT()

    您可以尝试使用下一种方法来解决此错误:

    SELECT 
       CASE 
           WHEN TRY_CONVERT(int, asmt.UserResponse) IS NOT NULL THEN TRY_CONVERT(int, asmt.UserResponse) 
           ELSE 0 
       END [Response]
    FROM (
        SELECT 
           CASE 
              WHEN TRY_CONVERT(int, '.') IS NOT NULL THEN TRY_CONVERT(int, '.') 
              ELSE 0 
           END AS UserResponse
    ) asmt
    

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 2011-12-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多