将 varchar(max) 值"TNK_99"转换为数据类型 int 时转换失败



我正在使用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"是我的列名。 任何帮助将不胜感激。

此表达式:

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'' )'

最新更新