2010-12-09 12 views
3

Gibt es eine Möglichkeit, die Spaltennamen einer bestimmten Tabelle außer den Spalten mit nur Nullwerten auszuwählen, ohne zu wissen, wie viele Spalten die Tabelle hat.Alle Spalten außer denen mit nur Nullwerten auswählen

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

Sollte in Folge:

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

Dank!

+4

Sollte das Ergebnis nicht col1 und col3 sein? –

+0

Natürlich. Das tut mir leid. – picknick

Antwort

1

Erstellen Sie eine gespeicherte Prozedur mit folgendem Inhalt:

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

Funktioniert gut. Vielen Dank! – picknick

0

dieser Struktur mit einer Abfrage in einem Geschäft Prozedur tun können, die Sie für jede Spalte Name der Tabelle zu fragen erlaubt und wenn es Nullwerte hat, ohne caring, wie viele Spalten Ihre Tabelle

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

Versuchen sie, diese hat, es ist nicht das sauberste, aber funktioniert, setzen nur @Table auf Ihren Tabellennamen.

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

Auch funktioniert super. Vielen Dank! – picknick

Verwandte Themen