Hi @WONG Tony,
Please try the following solution.
It is fully dynamic and elegant, and not using any conditional logic.
DECLARE @TableA TABLE
(
ID INT PRIMARY KEY,
Name VARCHAR(20),
TableBColmn VARCHAR(100),
TableBID INT
);
INSERT INTO @TableA VALUES
(1, 'John', 'TableBColumn1', 101),
(2, 'Mary', 'TableBColumn3', 102);
DECLARE @TableB TABLE
(
ID INT PRIMARY KEY,
TableBColumn1 VARCHAR(20),
TableBColumn2 VARCHAR(20),
TableBColumn3 VARCHAR(20),
TableBColumn4 VARCHAR(20)
);
INSERT INTO @TableB VALUES
(101, 'Married', NULL, NULL, NULL),
(102, NULL, NULL, 'Engineer', NULL);
SELECT A.ID, A.Name AS Header1
, c.value('(/root/*[local-name()=sql:column("A.TableBColmn")]/text())[1]', 'VARCHAR(20)') AS Header
--, c
FROM @TableA as A inner join
@TableB as B on A.TableBID = B.ID
CROSS APPLY (SELECT B.* FOR XML PATH(''), TYPE, ROOT('root')) AS t(c);
Output
ID | Header1 | Header |
---|---|---|
1 | John | Married |
2 | Mary | Engineer |