Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将varchar(max)值“TNK_99”转换为数据类型int时,转换失败_Sql_Sql Server - Fatal编程技术网

Sql 将varchar(max)值“TNK_99”转换为数据类型int时,转换失败

Sql 将varchar(max)值“TNK_99”转换为数据类型int时,转换失败,sql,sql-server,Sql,Sql Server,我与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 =

我与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;
当我尝试运行查询时,出现以下错误:

将varcharmax值“TNK_99”转换为时,转换失败 数据类型int

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

此表达:

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,您可能需要检查列的数据类型是否也是数字。否则,您可能仍然会出现转换错误。否则,您可能会得到一些动态SQL,其中包含一个WHERE子句,如WHERE[Name]=0,在将varchar50值“Gordon Linoff”转换为数据类型int时,在转换过程中出现了一个很好的错误。Gordon Linoff,您的代码返回NULL。这意味着它不能正常工作