SQL循环遍历表和列以查找哪些列不为空

时间:2017-10-06 17:08:54

标签: sql sql-server

我创建了一个包含3个字段的临时表#test:ColumnName,TableName和Id。 我想看看#test表中的哪些行(各自表中的列)不是空的?即,对于ColumnName字段中的每个列名,以及TableName字段中找到的相应表,我想查看该列是否为空。尝试了一些事情(见下文),但没有得到任何结果。求助。

declare @LoopCounter INT = 1, @maxloopcounter int, @test varchar(100),
        @test2 varchar(100), @check int
set @maxloopcounter =  (select count(TableName) from #test)

while @LoopCounter <= @maxloopcounter
begin
    DECLARE @PropIDs TABLE (tablename varchar(max), id int )

    Insert into @PropIDs (tablename, id) 
    SELECT [tableName], id FROM #test  
    where id = @LoopCounter 

    set @test2 = (select columnname from #test where id = @LoopCounter)

    declare @sss varchar(max)
    set @sss = (select tablename from @PropIDs where id = @LoopCounter)

    set @check = (select count(@test2) 
                  from (select tablename 
                        from @PropIDs 
                        where id = @LoopCounter) A
                 )

    print @test2
    print @sss
    print @check

    set @LoopCounter = @LoopCounter + 1
end

4 个答案:

答案 0 :(得分:1)

要在@Check=查询中将变量用作列名和表名,您需要使用Dynamic SQL

答案 1 :(得分:0)

最有可能采用更好的方法来做到这一点,但我无法想到一个方法。这就是我要做的。

  1. 使用select并声明游标而不是while循环。这样你就不必依赖顺序id了。游标将获取字段columnname,id和tablename

  2. 在循环中构建动态sql语句

    设置@Sql ='选择计数(*)Cnt进入#Temp2来自'+ TableName +'其中'+ @columnname +'不为空和'+ @columnname&lt;&gt; '''''

  3. Exec的(@sql)

  4. 然后检查#Temp2是否有大于0的值,如果这是你想要的,你可以使用被提取的@id来更新你的#Temp表。将结果放入标量变量而不是临时表是首选但不能记住最好的方法,并且使用临时表允许您使用更新连接,因此在我看来这很好。

  5. https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/ http://www.sommarskog.se/dynamic_sql.html

答案 2 :(得分:0)

找到一种从模式中提取所有非空表的方法,然后加入我创建的初始临时表。

select A.tablename, B.[row_count]

from (select * from #test) A

left join

(SELECT r.table_name, r.row_count, r.[object_id]
FROM sys.tables t
INNER JOIN (
    SELECT OBJECT_NAME(s.[object_id]) table_name, SUM(s.row_count) row_count, s.[object_id]
    FROM sys.dm_db_partition_stats s
    WHERE s.index_id in (0,1)
    GROUP BY s.[object_id]
) r on t.[object_id] = r.[object_id]
WHERE r.row_count > 0 ) B
on A.[TableName] = B.[table_name]

WHERE ROW_COUNT > 0
order by b.row_count desc

答案 3 :(得分:0)

这个 - bitmask计算列如何检查NULLability。位掩码中的值告诉您列是否为NULL。计算基数2.

    CREATE TABLE FindNullComputedMask
        (ID int
        ,val int
        ,valstr varchar(3)
        ,NotEmpty as 
            CASE WHEN ID IS NULL THEN 0 ELSE 1 END 
              | 
            CASE WHEN val IS NULL THEN 0 ELSE 2 END 
              | 
            CASE WHEN valstr IS NULL THEN 0 ELSE 4 END
        )

    INSERT FindNullComputedMask 
    SELECT 1,1,NULL

    INSERT FindNullComputedMask 
    SELECT NULL,2,NULL

    INSERT FindNullComputedMask 
    SELECT 2,NULL, NULL

    INSERT FindNullComputedMask
    SELECT 3,3,3

    SELECT *
    FROM FindNullComputedMask