2016-10-24 70 views
1

方案:两个数据库位于同一服务器中。 SRC DB和TGT DB。两个表具有相同的20个具有相同列名的表。如果今天的SRC和TGT DB相等,并且明天SRC中很少的列值被更新。我怎样才能动态地使用sql server捕获这些改变的列名。 我使用的逻辑如下,但它是每个表的硬编码解决方案。我希望它是动态的。在SQL Server 2008中动态捕获更改的列名称

CODE

SELECT DISTINCT PK_COL_NAMES, 
Result = CASE WHEN **a.COL1 != b.COL1 THEN ‘COL1,' ELSE '' END + 
CASE WHEN a. COL2 != b. COL2 THEN 'COL2,' ELSE '' END + 
CASE WHEN a. COLN != b. COLN THEN 'COLN,' ELSE '' END**    
FROM #TEMP b 
     LEFT JOIN #TEMP a 
      ON a.PK_COL1=b.PK_COL1 AND 
a.PK_COL2=b.PK_COL2 

WHERE  **a.COL1 != b.COL1 OR 
a.COL2 != b.COL2 OR 
a.COLN != b.COLN** 

PKCOL - >从表中,但初步相同的列名

PS:我的一个表中有大约98列,well.They变化从桌到桌。

+0

一种方法是合并[信息模式](https://msdn.microsoft.com/en-GB /library/ms186778.aspx)与[动态sql](https://msdn.microsoft.com/en-us/library/ms709342%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)。 –

+0

你可以尝试在SQL Server 2008中更改跟踪https://technet.microsoft.com/en-us/library/cc280462(v=sql.105).aspx –

+0

@KannanKandasamy是的,我尝试使用信息架构..但我是无法动态实现它。 –

回答

0

为什么不使用ddl触发器。看看这个article它可以跟踪服务器或数据库中的数据定义的任何更改

+0

触发器我们必须单独应用所有表,所以当发生任何更改时列会自动提取,但如果明天将一个新表添加到列表中,会发生什么?我们再次需要添加触发器。但是,我想要捕获所有PK列,并且应该有单独的列,其中应包含更新的列名称,我将存储在某个TEMP表中。最重要的是我正在处理TEMP表格,所以触发器不会有效。我甚至尝试过触发器。 –

+0

看一看[这里](http://stackoverflow.com/questions/4812412/creating-a-trigger-to-only-run-when-a-new-table-is-being-created)我在说数据库触发不是表触发器 – Hadi