У меня есть приложение COTS, в котором есть таблица аудита со столбцом в формате XML.Я пытаюсь проанализировать все данные, чтобы я мог написать отчет SSRS, который будет ориентирован на клиента.При сохранении системы приложение записывает исходные данные и измененное значение в столбец XML.Это означает, что столбец может содержать одно или несколько значений и может быть одним из многих типов измененных данных.
Я хочу закончить запросом, который покажет, какие данные были изменены и на какие.
Могу ли я написать запрос, который бы возвратил все значения, существующие в столбце, чтобы в худшем случае я мог явно выписать все значения, которые произошли до сих пор?
Возможно ли, чтобы он просто динамически извлекал данные, идентифицируя их?
Пример XML-записи:
<LogMessage>
<Fields>
<TransactionCount />
<PersonnelType>
<OldValue> Contractor </OldValue>
<NewValue> Employee </NewValue>
</PersonnelType>
<Disabled>
<OldValue> TRUE </OldValue>
<NewValue> FALSE </NewValue>
</Disabled>
<Expiration>
<OldValue> 10/31/2018</OldValue>
<NewValue> 12/31/2019 </NewValue>
</Expiration>
</Fields>
</LogMessage>
Количество транзакций, указанное выше, просто указывает, что оно было изменено, но не отслеживается.Поэтому я только что сделал оператор CASE, который, если он существует, возвращает значение, а если нет, оставляет его NULL.Во всех записях, которые я просматривал, старое значение всегда перед новым значением.
В каждой ячейке может быть одна или несколько записей, и невозможно определить, что они будут делать раньше.
Я пошел по пути, просматривая ячейки и просто вызывая каждый возможный экземпляр для извлечения данных.
XML.value('(LogMessage/Fields/Disabled/OldValue)[1]','varchar(5)') AS 'Old_Disabled'
XML.value('(LogMessage/Fields/Disabled/NewValue)[1]','varchar(5)') AS 'New_Disabled'
Затем я собирался попытаться выполнить какую-то логику конкатенации, когда значение NULL не равно нулю, с использованием TSQL.
Я использовал этот фрагмент кода, который возвращал все значения, но поскольку он был удаленвсю информацию тега, которую я не смог определить, что было изменено
XML.value('(LogMessage/Fields)[1]','varchar(max)') AS 'Raw_Data'
Приведенная выше строка в примере вернула бы это (все значения, без пробелов, без указания того, что представляет значение): ContractorEmployeeTRUEFALSE10 / 31 /201812/31/2019
Если есть способ изменить приведенный выше код так, чтобы он возвращал что-то вроде этого, это было бы здорово, но это должно быть динамически.
PersonnelType Old: Подрядчик Новый: Сотрудник
Отключено Старый: Истинный Новый: Ложный
Срок действия: Старый: 31.10.2008 НОВЫЙ: 12/31/2019
Даже это было бы здорово:
PersonnelType Подрядчик, Сотрудник
Отключено Истина, Да
Срок действия 31.10.2008, 12/31/2019