Намерих нещо, но това означава да използвам КУРСОР
DECLARE @ColumnName VARCHAR(200)
DECLARE @ColumnCount INT
DECLARE @sql VARCHAR(400)
CREATE TABLE #tempTable (Id INT)
DECLARE GetNonNullRows CURSOR
FOR
SELECT c.NAME, (SELECT COUNT(*) FROM sys.columns col WHERE col.object_id = c.OBJECT_ID) FROM sys.tables AS t
JOIN sys.columns AS c ON t.object_id = c.object_id
WHERE t.name = 'SomeTable' AND t.type = 'U'
OPEN GetNonNullRows
FETCH NEXT FROM GetNonNullRows INTO @ColumnName, @ColumnCount
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'SELECT st.UniqueId FROM SomeTable AS st WHERE ' + CONVERT(varchar, @ColumnName) + ' IS NOT NULL'
INSERT INTO #tempTable
EXEC (@sql)
FETCH NEXT FROM GetNonNullRows INTO @ColumnName, @ColumnCount
END
CLOSE GetNonNullRows
DEALLOCATE GetNonNullRows
SELECT * FROM SomeTable AS st1
WHERE st1.UniqueId IN (SELECT Id FROM #tempTable AS tt
GROUP BY Id
HAVING COUNT(Id) = @ColumnCount)
DROP TABLE #tempTable
Позволете ми да обясня това малко.
Първо създавам курсор, който преминава през всички колони на една таблица. За всяка колона създадох sql скрипт за търсене в таблицата за ненулеви стойности за избраната колона. За тези редове, които отговарят на критериите, вземам неговия уникален идентификатор и го поставям във временна таблица и тази работа използвам за всички колони.
В крайна сметка само идентификатори, чийто брой е като броят на колоните, са вашият резултатен набор, тъй като само редове, които имат идентичен брой изяви като брой колони в таблицата, могат да бъдат редове с всички ненулеви стойности във всички колони.