簡體   English   中英

SQL 遍歷表和列以查找哪些列不是空的

[英]SQL Loop through tables and columns to find which columns are NOT empty

我創建了一個包含 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

為了在@Check=查詢中使用變量作為列名和表名,您需要使用Dynamic SQL

很可能有更好的方法來做到這一點,但我想不出一個辦法。 這就是我要做的。

  1. 使用 select 並聲明一個游標,而不是像您擁有的 while 循環。 這樣你就不必依賴順序 ID。 游標將獲取字段 columnname、id 和 tablename

  2. 在循環中構建動態sql語句

    Set @Sql = 'Select Count(*) Cnt Into #Temp2 From ' + TableName + ' Where ' + @columnname + ' Is not null And ' + @columnname <> '''''

  3. 執行(@Sql)

  4. 然后檢查 #Temp2 是否有大於 0 的值,如果這是您想要的,您可以使用提取的 @id 來更新您的 #Temp 表。 將結果放入標量變量而不是臨時表將是首選,但不記得這樣做的最佳方法,並且使用臨時表允許您使用更新連接,因此在我看來這很好。

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

找到了一種從架構中提取所有非空表的方法,然后加入了我創建的初始臨時表。

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

這個一個如何 - 位掩碼計算列檢查可空性。 位掩碼中的值告訴您列是否為 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM