Это грубый способ сделать это, и если вы не знаете количество столбцов в каждой таблице, вам понадобится использовать динамический sql для их перечисления, но для целей этого примера я предположил, что вы знаете число столбцов и имен, которые вы хотите заполнить.
Запрос объединения позволяет предварительно заполнить имена нужных столбцов с помощью синтаксиса col1, а затем сводная таблица позволяет сопоставить отображаемые имена и отображаемые значения. Оператор case необходим для обеспечения отображения правильных значений, и вам необходимо заполнить имена производных столбцов для сводного запроса, но вы получите желаемый результат таким образом.
declare @table1 table (
Templateid int,
Col1 date,
col2 int,
col3 nvarchar(10),
col4 int
);
insert into @table1 (Templateid, col1, col2, col3, col4)
values
(95, '2019-05-28', '1234', 'test123', '123456');
declare @table2 table (
Templateid int,
Displayname nvarchar(10),
ColumnName nvarchar(10)
);
insert into @table2 (Templateid, Displayname, ColumnName)
values
(95, 'date', 'col1'),
(95, 'rank', 'col2'),
(95, 'purpose', 'col3'),
(95, 'sign', 'col4');
select * from
(
select columnname+'Name' as columnname, Displayname
from @table2 t2
union
select columnname+'Value', case when columnname='col1' then cast(col1 as nvarchar(15))
when columnname='col2' then cast(col2 as nvarchar(15))
when columnname='col3' then cast(col3 as nvarchar(15))
when columnname='col4' then cast(col4 as nvarchar(15)) end
from @table1 t1 inner join @table2 t2 on t1.Templateid=t2.Templateid) src
pivot
(max(displayname) for columnname in ([col1Name],[col1Value], [col2Name],[col2Value], [col3Name],[col3Value], [col4Name],[col4Value])) piv;