2010-12-09 5 views
3

Existe-t-il un moyen de sélectionner les noms de colonne d'une table donnée, à l'exception des colonnes avec des valeurs nulles sans connaître le nombre de colonnes.Sélectionner toutes les colonnes à l'exception de celles qui ne contiennent que des valeurs nulles

------------------------- 
| col1 | col2 | col3 | 
------------------------ 
| val1 | null | val2 | 
| val1 | null | null | 
| null | null | val2 | 
------------------------- 

devrait se traduire par:

------------------------------------ 
| cols_except_those_with_null_only | 
----------------------------------- 
| col1        | 
| col3        | 
------------------------------------ 

Merci!

+4

Le résultat ne devrait-il pas être col1 et col3? –

+0

Bien sûr. Désolé pour ça. – picknick

Répondre

1

Créer une procédure stockée avec le contenu suivant:

create table #cols (colname varchar(255), nullCount int) 

insert into #cols (colname) 
select name from syscolumns where id = object_id('tblTest') 

declare @c varchar(255) 

declare curCols cursor for select colname from #cols 
open curCols 
fetch next from curCols into @c 
while @@fetch_status = 0 begin 
    exec ('update #cols set nullCount = (select count(*) from tblTest where ' + @c + ' is not null) where colname = ''' + @c + '''') 
    fetch next from curCols into @c 
end 
close curCols 
deallocate curCols 

declare @rv table (cols_expect_those_with_null_only varchar(255)) 

insert into @rv (cols_expect_those_with_null_only) 
select colname from #cols 
where nullCount > 0 

drop table #cols 

select * from @rv 
+0

Fonctionne très bien. Merci! – picknick

0

Avec cette structure, vous pouvez faire une requête dans une procédure de magasin qui vous permet de demander le nom de chaque colonne du tableau et si elle a des valeurs nulles sans caring combien de colonnes de votre table a

SELECT a.[name] as 'Table', 
    b.[name] as 'Column' 
FROM sysobjects a 
INNER JOIN syscolumns b 
ON a.[id] = b.[id] 
where table='yourtable' 
1

Essayez ceci, ce n'est pas tidiest mais fonctionnera, vient de mettre @Table à votre nom de la table.

DECLARE @Table AS VARCHAR(100) 
SET @Table = 'Example' 

DECLARE @TempColumn VARCHAR(100) 
DECLARE @Sql NVARCHAR(300) 
DECLARE @HasNoNulls INT 

CREATE TABLE #Columns (
ColumnName VARCHAR(100) 
) 

DECLARE ColumnCursor CURSOR FOR 
SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.Columns 
WHERE TABLE_NAME = @Table 

OPEN ColumnCursor 

FETCH NEXT FROM ColumnCursor 
INTO @TempColumn 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @SQL = 'SELECT @HasNoNullsOut = COUNT(*) FROM ' + @Table + ' WHERE ' + @TempColumn + ' IS NOT NULL' 
PRINT @SQL 
EXECUTE sp_executesql @SQL, N'@HasNoNullsOut int OUTPUT', @[email protected] OUTPUT 

IF @HasNoNulls > 0 
BEGIN 
    INSERT INTO #Columns 
    VALUES(@TempColumn) 
END 

FETCH NEXT FROM ColumnCursor 
INTO @TempColumn 
END 

CLOSE ColumnCursor 
DEALLOCATE ColumnCursor 

SELECT * FROM #Columns 

DROP TABLE #Columns 
+0

Fonctionne aussi très bien. Merci! – picknick

Questions connexes