2012-01-13 88 views
2

SQL Server 2008的選擇列名其中的數據不爲空或空白

我有一個表MyTable的列A, B, C, D

當我選擇一排我想只能用非空的列的列表/空白。結果集是

A 
C 
D 

如果B在我行空。

其實,有一天可能會有一列E。但我可以從另一個tabie所有可能的列名,需要檢查是否MyTabie有任何人如果有哪些有數據爲行,我選擇

這樣:

select * from MyTable where ID = 6 

select ColumnName from AllColumnNames 
  • 對於每個ColumnName在結果
    • 如果存在MyTableColumnName並且在它where ID = 6數據,添加ColumnName輸出。

有一定有一個方式在一個查詢中這樣做嗎?

+2

我能想到的唯一方法就是用動態sql – 2012-01-13 05:56:47

回答

3

這會將您的表格轉換爲CTE中的XML,然後使用XQuery查找沒有空值的節點名稱。如果您的列名不違反XML節點名稱的規則,這將工作。

;with C(TableXML) as 
(
    select * 
    from MyTable 
    where ID = 6 
    for xml path('T'), elements xsinil, type 
) 
select T.X.value('local-name(.)', 'sysname') as ColumnName 
from C 
    cross apply C.TableXML.nodes('/T/*') as T(X) 
where T.X.value('.', 'nvarchar(max)') <> '' 

試一下:http://data.stackexchange.com/stackoverflow/query/59187

添加此where子句,如果你要排除的ID列,以及在中。

T.X.value('local-name(.)', 'sysname') <> 'ID'