比较两行数据之间的值,仅显示不同的列

时间:2010-10-28 16:59:11

标签: sql crystal-reports pivot audit-tables

在之前的应用程序版本中,我们使用特定字段作为主键,但由于该字段可能表示不同系统中的不同标识,因此我们将其设置为非重要字段(即不是主键或复合主键的一部分)但是,由于我们没有其他系统,用户仍然使用该字段作为主要的识别方法。

问题在于审计...以前我使用单个表来对数据库进行所有审计,使用浮动的通用触发器使用newvalue oldvalue模式转储数据。除了一件事,这仍然可以正常工作。我已将联系信息移动到一个单独的表中,该表与原始表的新主键相关联。因此,当进行更改时,审计日志中显示的是不熟悉且未使用的主键,而不是现在无关紧要的foreignSystemID ...

我开始执行一对一的审核复制方法,以便对任何表的任何更改现在都写入不同模式中的镜像。问题归结为显示用户的更改。他们习惯于查看仅显示特定医生的更改值的报告......

我的问题是使用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

1 个答案:

答案 0 :(得分:0)

听起来我觉得有一个设计问题,但我很难想象你的设计目前是什么。您是否可以更具体地了解您的表格目前的样子以及您尝试生成报告的数据?

另外,在谈到审核“已更改的值”时,如何跟踪已更改的内容?