Sql 将varchar(max)值“TNK_99”转换为数据类型int时,转换失败
我与SQL女士合作。我编写了一个简单的代码,它遍历表中的列,并找到零值超过30%的列。我将在@array中保存大于30%零的列的名称。@count只有列数,@column有所有列的名称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 =
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。这意味着它不能正常工作