2017-05-24 6 views
0

내가 작동하지 않았다 이런 식으로 뭔가를 시도했다. 그래서 나는 어떤 종류의 JOIN이 필요합니까? 변수를 선언하고 반복을 사용해야합니까?SQL Server에서 테이블에서 열 이름을 가져오고 null이 아닌 값을 계산하는 방법은 무엇입니까?</p> <pre><code>SELECT COLUMN_NAME, COUNT(COLUMN_NAME) AS COUNT_NOT_NULL FROM myDB.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTable'; </code></pre> <p>물론, "정보 메타 테이블"계산 myTable에의 데이터를 가지고 있지 않습니다

이상한 부분이 솔루션은 일부 테이블 작동,하지만 다른 사람을 위해 (이 널 (null)을 계산)이다 : https://stackoverflow.com/a/24411738/8055476

+1

동적 SQL을 사용하여 연결된 대답은 그렇지 않습니다. 실제로 스크립트가 무엇을하는지 생각하면 스크립트가 작동하지 않는 이유를 알 수 있습니다. – iamdave

+0

다음은 [동적 SQL] (https://docs.microsoft.com/en-us/sql/odbc/reference/dynamic-sql)의 MS Docs에 대한 링크입니다. –

+0

@RamonLeonardi 그 wolud 귀하의 요구 사항으로 결과를 얻을 희망이 –

답변

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 

아래의 코드로 테이블을 생성 주어진 테이블의 동적 열 이름을 얻고 null 이외의 카운트 값 얻을

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