【问题标题】:Conversion failed when converting the nvarchar value "XX" to data type int while sorting排序时将 nvarchar 值“XX”转换为数据类型 int 时转换失败
【发布时间】:2013-02-04 15:07:56
【问题描述】:

我想使用如下图所示的下拉列表按文章标题对我的网格视图进行排序。 我将我的网格视图连接到 dataSqlsouce。 但它给了我这个错误: 将 nvarchar 值“XX”转换为数据类型 int 时转换失败。

我的datasqlsource中的Sql cod是:

SELECT addtitle.title, 
       submitmanuscript.status, 
       addarticletype.type, 
       addarticletype.username                           AS Expr1, 
       addarticletype.articletype, 
       submitmanuscript.date, 
       submitmanuscript.articlenum, 
       addarticletype.articleid, 
       CONVERT (VARCHAR(10), submitmanuscript.date, 103) AS date1, 
       addarticletype.checkfinish, 
       rolinfo.* 
FROM   addarticletype 
       INNER JOIN addtitle 
               ON addarticletype.articleid = addtitle.articleid 
       INNER JOIN submitmanuscript 
               ON addarticletype.articleid = submitmanuscript.articleid 
       INNER JOIN rolinfo 
               ON addarticletype.username = rolinfo.username 
WHERE  ( addarticletype.articleid IN (SELECT articleid 
                                      FROM   addupload_4 AS AddUpload_4_1 
                                      WHERE 
         ( addarticletype.checkfinish = '0' )) ) 
       AND ( addarticletype.type = @Type ) 
ORDER  BY CASE 
            WHEN @order = 'AddArticleType.ArticleID' THEN addarticletype.articleid 
            WHEN @order = 'Title' THEN CONVERT(VARCHAR, title) 
            WHEN @order = 'family' THEN family 
            WHEN @order = 'AddArticleType.ArticleType' THEN 
            addarticletype.articletype 
          END 

任何人都可以帮助我吗?

【问题讨论】:

  • 我使用 CONVERT(VARCHAR,Title) 使其成为 nvarchar!
  • 谢谢,您有什么建议?

标签: asp.net sql sorting


【解决方案1】:

我认为问题出在您的 ORDER BY CASE 语句中——您尝试按整数和/或 nvarchars 排序,但它不允许这样做:

看到这个小提琴:

http://sqlfiddle.com/#!3/db37b/1

您可以通过将所有排序值转换为 nvarchar 来解决此问题,尽管@Gordons 的答案似乎更合适:

ORDER  BY CASE 
        WHEN @order = 'AddArticleType.ArticleID' THEN CONVERT(nvarchar,addarticletype.articleid) 
        WHEN @order = 'Title' THEN CONVERT(nvarchar, title) 
        WHEN @order = 'family' THEN CONVERT(nvarchar, family)
        WHEN @order = 'AddArticleType.ArticleType' THEN 
         CONVERT(nvarchar, addarticletype.articletype )
      END 

您可能只需要在 ArticleId 字段上使用 CONVERT,但我继续将其放在所有字段上,因为我不知道它们的数据类型。

祝你好运。

【讨论】:

    【解决方案2】:

    case 语句必须选择一种类型才能返回。第一个then 是导致问题的数字。

    只需将子句拆分为单独的case 语句:

    ORDER BY (CASE WHEN @order = 'AddArticleType.ArticleID' THEN AddArticleType.ArticleID  end),
             (case WHEN @order = 'Title' then CONVERT(VARCHAR,Title) end),
             (case WHEN @order = 'family' THEN family end),
             (case WHEN @order = 'AddArticleType.ArticleType' THEN AddArticleType.ArticleType END)
    

    【讨论】:

    • 我认为这里的问题是按顺序排列的逗号 -- 在每个 CASE 语句中添加“ELSE 0”或一些任意值,它应该可以工作......
    • 您遇到什么错误?您应该能够在order by 中有多个表达式。缺少else 子句无关紧要;它应该默认为 NULL。
    • @GordonLinoff -- 很抱歉,你是绝对正确的。我没有发现您的代码有任何问题。
    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 2011-08-29
    • 2015-06-20
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多