遍历表中的所有列

时间:2020-06-04 13:58:05

标签: sql-server tsql

我试图找到一种方法来评估许多表中的所有字段并返回所填充数据的%。我需要寻找特定的东西,而不仅仅是NULL。 例如,在客户表中,它将返回所有字段,并说客户名称已完成45%, 地址完成90%等。

我需要搜索NULL,空白,未编码,-1与行数

有些表有30多个字段,因此为什么我认为循环最好。

IterableAssert

以下为我提供了表名

select 
cast(100 - ((select cast(count([ClientName])as decimal(10,2))
from [dbo].[Client]
where 
   [ClientName] is null 
or [ClientName] = '' 
 or [ClientName] = 'UNCODED'
or [ClientName] = -1
 )
 /
   (select cast(count([ClientName])as decimal(10,2))  
from [dbo].[Client]
where 
   [ClientName] is not null 
or [ClientName] <> '' 
 or [ClientName] <> 'UNCODED'
or [ClientName] <> -1
 ))as decimal(10,2)) as '%Completed'

我是SQL的新手,正试图弄清楚变量和循环,但没有得到。

1 个答案:

答案 0 :(得分:0)

您可以使用sys.columns中的简单字符串连接来构建所需的动态SQL查询,只是不要尝试添加ORDER BY,因为这种行为是不确定的,并且在许多情况下会导致莫名其妙地遗漏行

-- given these variables/parameters:
DECLARE @c int, @t nvarchar(511) = N'dbo.Client';

-- only proceed if this is actually an object (some protection from SQL injection):
IF OBJECT_ID(@t) IS NOT NULL
BEGIN
  -- we can get the row count from metadata instead of scanning the table an extra time:
  SELECT @c = SUM(rows) FROM sys.partitions 
    WHERE [object_id] = OBJECT_ID(@t) AND index_id IN (0,1);

  DECLARE @sql nvarchar(max) = N'SELECT [table] = N''' + @t + N'''',
          @col nvarchar(max) = N',' + CHAR(13) + CHAR(10) + N'[% $c$ complete] = '
               + N'CONVERT(decimal(5,2), 100.0*SUM(CASE WHEN $qc$ IS NULL '
               + N'OR $qc$ = SPACE(0) OR RTRIM($qc$) IN (''UNCODED'',''-1'') '
               + N'THEN 0 ELSE 1 END)/@c)';

  SELECT @sql += REPLACE(REPLACE(@col, N'$c$', name), N'$qc$', QUOTENAME(name))
    FROM sys.columns WHERE [object_id] = OBJECT_ID(@t);

  SELECT @sql += N' FROM @t;';
  SELECT @sql = REPLACE(@sql, N'@t', @t);

  PRINT @sql;
  --EXECUTE sys.sp_executesql @stmt = @sql, @params = N'@c int', @c = @c;
END

当您对输出感到满意时,请取消注释EXECUTE。请注意,您可能必须过滤掉某些数据类型(我不知道XML,二进制或诸如architectureid或geography之类的类型会发生什么,并且现在没有能力测试这些数据)。