2017-05-24 31 views
0

我想這樣的事情,沒有工作:如何從表中獲取列名並在SQL Server中計算它們的非空值?

SELECT COLUMN_NAME, COUNT(COLUMN_NAME) AS COUNT_NOT_NULL FROM myDB.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTable'; 

顯然,「信息薈萃表」沒有從MyTable的數據來算。那麼我需要某種JOIN?我是否需要聲明一些變量並使用一些迭代?

怪異的是,這個解決方案適用於某些表,但不是爲別人(它計數空值):https://stackoverflow.com/a/24411738/8055476

+1

你已經鏈接了使用動態SQL的答案,你不是。其實想想你的腳本正在做什麼,你會明白爲什麼它不工作。 – iamdave

+0

以下是[動態SQL]上MS文檔的鏈接(https://docs.microsoft.com/en-us/sql/odbc/reference/dynamic-sql)。 –

+0

@RamonLeonardi希望wolud能夠按照您的要求獲得結果 – 2017-05-24 14:21:55

回答

0

首先,我創建了一個表,一些樣本數據

IF OBJECT_ID('COuntNotNull') IS NOT NULL 
    Drop Table COuntNotNull 
    ;With cte(Column1 , Column2 , Column3 , Column4) 
    AS 
    (
    SELECT 'X'  , ' X' , NULL , 'X' Union all 
    SELECT NULL , NULL , 'X' , 'X'  Union all 
    SELECT NULL , NULL , NULL , NULL 
    ) 

    SELECT * INTO COUNTNOTNULL FROM cte 

下面的代碼動態獲取的列名對於給定的表,並得到非空的計數值

DECLARE @DynamicColms NVARCHAR(max) 
    ,@CaseDynamicColms NVARCHAR(max) 
    ,@Sql NVARCHAR(max) 
    ,@TableName VARCHAR(100) = 'COuntNotNull'--Here give Your TableName 

SELECT @DynamicColms = STUFF((
      SELECT ', ' + COLUMN_NAME 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = @TableName 
      FOR XML PATH('') 
      ), 1, 1, '') 

--SELECT @DynamicColms 
SELECT @CaseDynamicColms = STUFF((
      SELECT '+ ' + 'CASE WHEN ' + COLUMN_NAME + ' IS NOT NULL THEN 1 ELSE 0 END' 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = @TableName 
      FOR XML PATH('') 
      ), 1, 1, '') 

--SELECT @CaseDynamicColms 
SET @Sql = 'SELECT ' + @DynamicColms + ',' + @CaseDynamicColms + CHAR(13) + CHAR(10) + ' AS COUNT_NOT_NULL FROM ' + @TableName 

PRINT @Sql 

EXECUTE (@Sql) 

結果

Column1 Column2 Column3 Column4 COUNT_NOT_NULL 
------------------------------------------------- 
X  X  NULL  X   3 
NULL NULL X  X   2 
NULL NULL NULL  NULL  0 
相關問題