-
Yitzhak Khabinsky 20,021 Reputation points
2023-01-06T18:52:55.967+00:00 Hi @Kenny Gua ,
Please try the following solution.
It is based on SQL Server XML and XQuery powers.SQL
USE tempdb; GO DROP TABLE IF EXISTS #tmpTable; CREATE TABLE #tmpTable (A1 char(1), B char(1), C char(1), D char(1), E char(1), F char(1), G char(1), H char(1), I char(1), j char(1), K char(1), L char(1)); Insert into #tmpTable VALUES ('N','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','N'), ('2','N','Y','N','Y','Y','Y','Y','Y','Y','Y','Y'); DECLARE @sql NVARCHAR(1024) = N'SELECT ' + ( SELECT STRING_AGG(name, ', ') FROM ( SELECT name FROM tempdb.sys.columns WHERE object_id = object_id('tempdb..#tmpTable') EXCEPT SELECT DISTINCT x.value('local-name(.)', 'SYSNAME') FROM #tmpTable AS t CROSS APPLY (SELECT t.* FOR XML PATH(''), TYPE, ROOT('root')) AS t1(c) CROSS APPLY t1.c.nodes('/root/*[not(text()=("Y","Y Option"))]') AS t2(x)) z) + ' FROM #tmpTable;'; EXEC sys.sp_executesql @sql;
Output
+---+---+---+---+---+---+---+---+ | C | E | F | G | H | I | j | K | +---+---+---+---+---+---+---+---+ | Y | Y | Y | Y | Y | Y | Y | Y | | Y | Y | Y | Y | Y | Y | Y | Y | +---+---+---+---+---+---+---+---+
Try one of approaches:
declare @sql varchar(max) = 'select ' +
stuff(
(
select ', ''Y'' as ' + t.c
from Validate
cross apply (values
(A, 'A', 1),
(B, 'B', 2),
(C, 'C', 3),
(D, 'D', 4),
(E, 'E', 5),
(F, 'F', 6),
(G, 'G', 7),
(H, 'H', 8),
(I, 'I', 9),
(J, 'J', 10),
(K, 'K', 11),
(L, 'L', 12)) t(v, c, n)
where t.v = 'Y'
order by n
for xml path('')
), 1, 2, '')
exec (@sql)
At least one value must be "Y".