Сравнение значений между двумя строками данных и отображение только тех столбцов, которые отличаются

В предыдущей версии приложения мы использовали конкретное поле для первичного ключа, но поскольку это поле может представлять разные идентификаторы в разных системах, мы сделали его несущественным полем (т. е. не первичным ключом или частью составного первичного ключа), однако поскольку у нас нет другой системы, но пользователи по-прежнему используют это поле в качестве основного метода идентификации.

Проблема заключается в аудите... ранее я использовал одну таблицу для выполнения всех аудитов для базы данных, выгружающей данные со схемой newvalue oldvalue, используя общий триггер, который плавает вокруг. Это все еще может работать нормально, за исключением одной вещи. Я переместил контактную информацию в отдельную таблицу, привязанную к новому первичному ключу исходной таблицы. Поэтому, когда вносятся изменения, в журнале аудита отображается незнакомый и неиспользуемый первичный ключ вместо уже несущественного externalSystemID...

Я перешел к использованию метода аудита копирования «один к одному», чтобы любые изменения в любой таблице теперь записывались в зеркальное отображение в другой схеме. Проблема сводится к показу изменений пользователям. Они привыкли видеть отчет, в котором показаны только измененные значения для конкретного врача...

Мой вопрос будет заключаться в использовании запросов sql и отчетов Crystal, как я могу отображать только измененные значения столбцов между строками в моих таблицах аудита. Я посмотрел на команду поворота, но я не думаю, что это действительно поможет мне. Я также просмотрел код внутри сценария, который сравнивает столбцы и определяет, отличаются ли они, и записывает их в таблицу.

я действительно вращаюсь в песке здесь, и это критическая проблема для меня, чтобы решить. Заранее благодарю за любую помощь...

мы достаточно рано приступили к работе, поэтому я мог бы изменить свой метод отслеживания изменений, если потребуется, но это должно произойти в ближайшее время. Благодарность

РЕДАКТИРОВАТЬ:

Мой босс и я немного поработали над этим, и это то, с чего мы начали... Я хотел бы получить дополнительные мнения и варианты... также... спасибо...

CREATE TABLE #TEMP (
    DoctorsID bigint, 
    TableName varchar(50), 
    FieldName varchar(50), 
    CurrentFieldValue varchar(255), 
    PreviousFieldValue varchar(255), 
    PreviousValueDate datetime 
    )

DECLARE @sql varchar(MAX)

SELECT 
    @sql = COALESCE(@sql,'') + 
    CAST(
        'INSERT INTO #TEMP ' + 
            'SELECT ' + 
                'o.DoctorsID, ' + 
                '''' + TABLE_NAME + ''' ,' + 
                '''' + COLUMN_NAME + ''',' + 
                'o.' + COLUMN_NAME + ',' +
                'a.' + COLUMN_NAME + ',' +
                'a.AuditDate' +
            ' FROM ' + 
                'dbo.DoctorLicenses o ' + 
                    'INNER JOIN Audit.DoctorLicenses a ON ' + 
                        'o.DoctorsID = a.DoctorsID ' + 
            'WHERE ' + 
                'AuditDate BETWEEN ''10/01/2010'' AND ''10/31/2010'' AND ' + 
                'o.' + COLUMN_NAME + ' <> a.' + COLUMN_NAME + 
            ';'     
    AS varchar(MAX))
FROM 
    INFORMATION_SCHEMA.COLUMNS AS [Fields]      
WHERE 
    TABLE_SCHEMA = 'dbo' AND 
    TABLE_NAME = 'DoctorLicenses' 

PRINT @sql

EXEC(@sql)

SELECT * FROM #TEMP

DROP TABLE #TEMP

person ecathell    schedule 28.10.2010    source источник


Ответы (1)


Мне кажется, что есть проблема с дизайном, но мне трудно представить, какой у вас дизайн на данный момент. Не могли бы вы уточнить, как выглядят ваши таблицы в данный момент и по каким данным вы пытаетесь создать отчет(ы)?

Кроме того, говоря об аудите «измененных значений», как вы отслеживаете, что было изменено?

person Remus    schedule 28.10.2010
comment
извините, вы правы, мои первоначальные вопросы всегда кажутся двусмысленными. Каждая таблица имеет соответствующую таблицу в отдельной схеме. dbo.contactinfo имеет audit.contactinfo. все столбцы одинаковы, за исключением того, что в аудите есть 2 дополнительных (тип, дата аудита). При изменении элемента данных в таблицу аудита вставляется новая строка с текущими данными. Таким образом, у вас есть данные в предыдущей строке (при сортировке по дате аудита) и текущая дата в первой строке. Таким образом, если вы обычно запрашиваете таблицу аудита, вы получаете полный отчет обо всех изменениях, внесенных в эту таблицу. - person ecathell; 28.10.2010
comment
однако наши пользователи хотят видеть представление текущего значения/старого значения в столбцах. Я и мой босс на самом деле смогли справиться с этим довольно хорошо... смотрите мои правки... спасибо - person ecathell; 28.10.2010
comment
Ладно, я лучше понимаю, куда ты пытаешься попасть. Как выглядит конечный результат? - person Remus; 28.10.2010