SQL Unpivot,交叉应用,动态查询?

时间:2018-04-24 17:43:04

标签: sql-server tsql unpivot cross-apply

我正处于十字路口。有人可以帮助我......让我沿着正确的道路前进。

我想比较/显示来自2个数据库表的数据,如下所示:

  1. 应用程序数据库:许多表都有触发器,可以将更新/删除更改(审核)复制到另一个数据库。

  2. 审核数据库:从应用程序数据库中的触发器复制的信息

  3. 我想做的事应该相当简单。在下面,我想要做的是比较数据进行了哪些更改。

    我有一个带有CROSS APPLYUNIONS的工作版本(它很长并且手动输入了列,表等等)。列不是动态的,这使得数百行代码变得粗糙且无法管理。必须有一个更优雅的设计。请任何想法。

    我只需要从两个表中返回一个特定的行(ID)进行比较。

    APP DB
    colA   colB   colC   colD
    1      hello  foo    date
    
    APP Audit DB
    colA   colB   colC   colD
    1      hi     bar    date
    

    这就是希望输出的内容:

    colA_data    ColumnName       oldData      newData
    1            colB             hi           hello
    1            colC             bar          foo
    1            colD             date         date
    

    我希望我已经理解了我想要完成的任务。

    我想读取列名称动态(不是很难),然后将结果并排放置,就像报告原因一样。显然匹配列并将它们放入行中。

    示例代码将非常受欢迎。

1 个答案:

答案 0 :(得分:0)

最简单的事情可能是使用protected function attemptLogin(Request $request) { // here you can check if user is present or just create. return $this->guard()->attempt( $this->credentials($request), $request->filled('remember') ); }

1。静态版

这里介绍UNPIVOT的使用是一个简单的静态版本,可以解决你的问题:

UNPIVOT

结果:

enter image description here

2。动态版

现在是完整版。您可以使用动态SQL更改从SQL Server declare @appDB table( [colA] int, [colB] nvarchar(50),[colC] nvarchar(50),[colD] nvarchar(50)) declare @auditDB table( [colA] int, [colB] nvarchar(50),[colC] nvarchar(50),[colD] nvarchar(50)) insert into @appDB select 1,'hello', 'foo', 'date' insert into @auditDB select 1,'hi', 'bar', 'date' select old.ColA_data, old.ColumnName, old.OldData, new.NewData from( select o.colA as ColA_data, o.ColumnName, o.OldData from @auditDB s unpivot ([OldData] for [ColumnName] in ([colB], [colC], [colD])) o ) OLD inner join ( select n.colA as ColA_data, n.ColumnName, n.NewData from @appDB t unpivot ([NewData] for [ColumnName] in ([colB], [colC], [colD])) n ) NEW on new.ColA_data = old.ColA_data and new.ColumnName = old.ColumnName 元数据中检索它们的列。 请注意,在此示例中,我添加了一个新列(INFORMATION_SCHEMA

ColE

结果:

enter image description here