Hi @Nik,
Please try the following solution as a starting point.
USE tempdb;
GO
DROP TABLE IF EXISTS #tmpTable;
-- DDL and sample data population, start
CREATE TABLE #tmpTable (ID INT IDENTITY PRIMARY KEY, Col_1 VARCHAR(20), Col_2 VARCHAR(20), Col_3 VARCHAR(20), Col_4 VARCHAR(20));
INSERT INTO #tmpTable (Col_1, Col_2, Col_3, Col_4) VALUES
(NULL, 'Nike', 'Adidas', NULL),
(NULL, 'Nike', 'Adidas', 'Asics'),
(NULL, 'Asics', NULL, 'Asics'),
(NULL, 'Nike', NULL, 'Adidas');
-- DDL and sample data population, end
DECLARE @total_row_counter INT = (SELECT count(*) from tempdb..#tmpTable);
;WITH rs AS
(
SELECT c.value('local-name(.)', 'sysname') AS column_name
FROM #tmpTable AS t
CROSS APPLY (SELECT t.* FOR XML PATH(''), TYPE) AS t1(x)
CROSS APPLY x.nodes('/*') AS t2(c)
), rs2 AS
(
(
SELECT name AS column_name, NULL AS row_counter_with_values
FROM tempdb.sys.columns
WHERE object_id = object_id('tempdb..#tmpTable')
AND is_nullable = 1
EXCEPT
SELECT column_name, NULL
FROM rs
)
UNION ALL
SELECT column_name, COUNT(*) AS row_counter_with_values
FROM rs
GROUP BY column_name
)
SELECT *
, @total_row_counter - COALESCE(row_counter_with_values,0) AS row_counter_with_nulls
, @total_row_counter AS total_row_counter
FROM rs2;