Мне нужно объединить динамически сводные данные с соответствующими таблицами на основе имен полей.
У меня есть таблица журнала аудита, в которой есть данные в структуре на основе строк
AuditID
Type
TableName,
LogBatchSeqID
PrimaryKeyField
PrimaryKeyValue
FieldName
OldValue,
NewValue,
UpdateDate,
UserName
В этой таблице хранятся журналы для любых изменений в столбцах таблицы, поскольку я не знаю, какой столбец изменится, поэтому я генерирую строки в столбце с помощью динамического сводного запроса, как показано ниже.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SET cols = SELECT STUFF((DISTINCT ',' + QUOTENAME(Name)
from Pres_AuditLogs
where TableName=''MyTableName''
group by FieldName, UpdateDate,[Type]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols +
N',PrimaryKeyField,PrimaryKeyValue,UpdateDate,[type] from
(
select NewValue,
FieldName,PrimaryKeyField,PrimaryKeyValue,UpdateDate,[Type]
from Pres_AuditLogs
where TableName=''MyTableName''
) x
pivot
(
max(NewValue)
for FieldName in (' + @cols + N')
) p order by UpdateDate desc '
exec sp_executesql @query;
Запрос дает мне ожидаемый результат в формате столбца строки, который именно то, что я хочу.
| -------- |------|--------|--------------|
| EmpID |DeptID|EditedBy| Remarks |
| -------- |------|--------|--------------|
| 2 | 8 | 40 | Test Remarks |
| -------- |------|--------|--------------|
Проблема в том, что после того, как я получил вышеуказанный набор результатов, мне нужно показать имя сотрудника, название отдела, отредактированное по имени пользователя из соответствующей таблицы. Ожидаемый результат должен быть таким, как показано ниже.
|------|--------|------|-------- |--------|--------|--------------|
|EmpID |Emp Name|DeptID|Dept Name|EditedBy|UserName| Remarks |
|------|--------|------|-------- |--------|--------|--------------|
| 2 | Alex | 8 | Finance | 40 | HrAdmin| Test Remarks |
|------|--------|------|---------|--------|--------|--------------|
Я знаю, что могу выполнить присоединение, если знаю, что результат всегда будет получен из таблицы сотрудника путем объединения таблицы «Пользователь», «Отдел» и «Сотрудник». Но так как в таблице журнала аудита есть другие журналы таблиц, я не уверен, как лучше всего динамически объединить набор результатов с соответствующей таблицей на основе имени поля или столбца.