Coś znalazłem, ale to oznacza użycie CURSOR
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
Pozwól mi to trochę wyjaśnić.
Najpierw tworzę kursor, który przechodzi przez wszystkie kolumny jednej tabeli. Dla każdej kolumny stworzyłem skrypt sql do wyszukiwania w tabeli wartości niezerowych dla wybranej kolumny. Dla tych wierszy, które spełniają kryteria, biorę jego unikalny identyfikator i umieszczam w tabeli tymczasowej, a tę pracę używam dla wszystkich kolumn.
Na koniec tylko identyfikatory, których liczba jest podobna do liczby kolumn, są twoim zestawem wyników, ponieważ tylko wiersze, które mają identyczną liczbę wystąpień, jak liczba kolumn w tabeli, mogą być wierszami z wszystkimi wartościami innymi niż null we wszystkich kolumnach.