2014-08-29 4 views
0

Я использую запрос, чтобы получить коллекцию столбцов имени:Выбор столбцов из запроса

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE [...] 

Из этой коллекции, я хотел бы считать каждое не нулевое, а не пустое значение из исходной таблицы по имени столбца.

Скажем, у меня есть таблица, содержащая

COL1 | COL2 | COL3 
------------------ 
VAL1 | VAL2 | NULL 
VAL3 |  | VAL4 
VAL5 |  | 

Я ищу запрос, чтобы получить:

COL1 | 3 
COL2 | 1 
COL2 | 1 

Это для аналитической цели.

Благодарим за помощь!

+0

Вам необходимо использовать динамический запрос: используйте 'INFORMATION_SCHEMA.COLUMNS', чтобы сгенерировать запрос в таблицах – Serpiton

+0

Нашли что-то похожее здесь http://www.sqlservercentral.com/Forums/Topic400832-392-1.aspx – mhn

ответ

1

Простой процесс. Выполните следующий запрос:

SELECT 'SELECT ''' + COLUMN_NAME + ''', COUNT(['+COLUMN_NAME']) as NotNull FROM [' +SCHEMA_NAME+ '].['+TABLE_NAME+ '] union all ' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE [...] 

Скопируйте результаты в окно запроса, удалите окончательный union all и выполнить запрос.

+0

Спасибо! Он отлично справился с этой задачей. –

0

Код ниже, кажется, работает для вашего вопроса

create table sample 
(
    col1 varchar(10), 
    col2 varchar(10), 
    col3 varchar(10) 
) 

INSERT INTO sample (COL1,COL2,COL3) VALUES ('VAL1 ',' VAL2 ',NULL); 
INSERT INTO sample (COL1,COL2,COL3) VALUES ('VAL3 ','  ',' VAL4'); 
INSERT INTO sample (COL1,COL2,COL3) VALUES ('VAL5 ','  ',' '); 
DECLARE @cols1 NVARCHAR(MAX); 
DECLARE @sql NVARCHAR(MAX); 

SELECT @cols1 = STUFF((
    SELECT ', COUNT(CASE WHEN len(['+ t1.NAME + '])!=0 THEN 1 END) AS ' + t1.name 
    FROM sys.columns AS t1 
    WHERE t1.object_id = OBJECT_ID('sample') 
    --ORDER BY ', COUNT([' + t1.name + ']) AS ' + t1.name 
    FOR XML PATH('') 
), 1, 2, ''); 

SET @sql = ' 
SELECT ' + @cols1 + ' 
FROM sample 
' 




EXEC(@sql) 
0

Hereis мой маленький больше времени на это:

declare @cols table (colID integer, colName varchar(50)) 
declare @results table (colName nvarchar(50), valueCount bigint) 

-- table name 
declare @tableName nvarchar(50) = 'INSERT TABLE NAME HERE' 

-- select column names from table 
insert into @cols 
select column_id, name from sys.columns where object_id = object_id(@tableName) order by column_id 

declare @currentColID int = 0 
declare @currentName nvarchar(50) = '' 
declare @currentCount bigint = 0 
declare @sql nvarchar(max) -- where the dynamic sql will be stored 

-- go through all columns 
while (1 = 1) 
begin 
    -- step by id 
    select top 1 @currentColID = c.colID, @currentName = c.colName from @cols c 
    where c.colid > @currentColID order by c.colID 

    if @@ROWCOUNT = 0 break; 

    -- dynamic query to get non-empty, not-null counts 
    select @sql = 'select @p1=COUNT(' + @currentName + ') from ' + @tableName + 
       ' where ' + @currentName + ' is not null or LEN(' + @currentName + ') > 0' 

    exec sp_executesql @sql, N'@p1 bigint output', @p1 = @currentCount output  

    -- insert result to buffer   
    insert into @results values (@currentName, @currentCount)  
end 

-- print the buffer 
select * from @results 

Весело :)

Смежные вопросы