【问题标题】:Conversion failed when converting the varchar(max) value 'TNK_99' to data type int将 varchar(max) 值“TNK_99”转换为数据类型 int 时转换失败
【发布时间】:2018-05-11 11:03:08
【问题描述】:

我正在使用 MS SQL。我编写了一个简单的代码,它遍历表中的列并找到零值超过 30% 的列。我将在 @array 中保存超过 30% 零的列的名称。@count 只有列数,而 @column 的名称为所有列。

  DECLARE @array varchar(MAX)
  DECLARE @sql varchar(MAX),
  @column as varchar(MAX)
  SELECT @count = (SELECT COUNT(*) FROM sys.columns WHERE object_id = 
  OBJECT_ID('UVE305_TREND_2.dbo.LOGTNK'))
  WHILE @counT>0
  BEGIN

      SET @column = (SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('UVE305_TREND_2.dbo.LOGTNK') AND column_id = @count)
   SELECT @column

     SET @array = (SELECT COUNT(@column) FROM UVE305_TREND_2.dbo.LOGTNK WHERE 
     @column = 0 )
     select @array

     SET @count= @count- 1
END;
IF @r_count >= CAST(@array AS INT)
     SET @list= @column+','+@list;

当我尝试运行查询时,出现以下错误:

将 varchar(max) 值“TNK_99”转换为 数据类型 int。

'TNK_99' 是我的列名。 任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这个表达式:

    WHERE @column = 0
    

    正在转换为:

    WHERE 'TNK_99' = 0
    

    也就是说,它将一个字符串(恰好是一个列名)与一个数字进行比较。根据 SQL 规则,这些值被转换为数字——并且您会得到一个转换错误。

    没有简单的方法可以解决这个问题。该解决方案涉及动态 SQL,这比您的代码要复杂得多。

    编辑:

    代码如下:

    DECLARE @sql NVARCHAR(MAX);
    WHILE @count > 0
    BEGIN
        SET @column = (SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('UVE305_TREND_2.dbo.LOGTNK') AND column_id = @count);
    
        SET @SQL = 'SELECT @array = COUNT(*) FROM UVE305_TREND_2.dbo.LOGTNK WHERE ' + QUOTENAME(@column) + ' = 0 )'
    
        EXEC sp_executesql @SQL, N'@array int output', @array=@array output;
    
        SELECT @column, @array
    
        SET @count= @count- 1
    END;
    

    与原始代码一样,这假定所有列都是数字的。这段代码对“零值”的含义有点模糊。也许你打算:

        SET @SQL = 'SELECT @array = COUNT(*) FROM UVE305_TREND_2.dbo.LOGTNK WHERE ' + QUOTENAME(@column) + ' = ''0'' )'
    

    【讨论】:

    • 您可能想要检查列的数据类型是否也是数字,Gordon。否则,您可能仍然会遇到转换错误。否则,您最终可能会得到一些具有WHERE 子句(如WHERE [Name] = 0)的动态SQL,并给出类似于Conversion failed when converting the varchar(50) value 'Gordon Linoff' to data type int. 的错误:)
    • Gordon Linoff,您的代码返回 NULL。这意味着它不能正常工作
    猜你喜欢
    • 2011-12-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多