动态T-sql比较列值

时间:2015-02-12 01:51:47

标签: sql sql-server-2008

我需要将A列与B列进行比较,依此类推......并标出差异  例如。

SELECT OL.ID
 ,OFT.ID
 ,CASE WHEN OL.ID <> OFT.ID THEN 'FALSE'
      ELSE 'TRUE'
  END AS DIFF_Flag
 ,OL.Fname
 ,OFT.Fname
 ,CASE WHEN OL.Fname <> OFT.Fname THEN 'FALSE'
      ELSE 'TRUE'
  END AS DIFF_Flag

FROM TABLE1 OL
INNER JOIN TABLE2 OFT ON OL.ID= OFT.ID

有太多的列要做到这一点......

我的动态SQL查询 - &gt;

declare @Table1ColumnList varchar(1000)='a.ID, a.Fname'
declare @Table2ColumnList varchar(1000)='b.ID, a.Fname'

declare @sql nvarchar(2000) 

set @sql= 'SELECT '+ @Table1ColumnList +' ,'+ @Table2ColumnList
 +', CASE WHEN ' + @Table1ColumnList + '<> '+@Table2ColumnList +' THEN '+'''FALSE'''
 +' ELSE '+'''TRUE'''
 +' END AS DIFF_flag'
 + ' FROM TABLE a
INNER JOIN TABLE b ON a.ID=b.ID'

如何递归循环遍历所有列..

样本O / P

o/p

我的问题类似于ref

我正在使用SQL Server 2008

1 个答案:

答案 0 :(得分:2)

select 'SELECT '''' as dummy, ';

select replace(
    ', case when coalesce(t1.%c, ''!@#'') <> coalesce(t2.%c, ''!@#'') then ''ROW '' + t1.ID + '': Mismatch in %c ('' + coalesce(t1.%c, ''NULL'') + '', '' + coalesce(t2.%c, ''NULL'') + '')'' else null end as Compare%c',
    '%c',
    COLUMN_NAME
    )
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'TABLE1' AND COLUMN_NAME <> 'ID'
order by ORDINAL_POSITION;

select 'FROM Table1 as t1 INNER JOIN Table2 as t2 on t2.ID = t1.ID WHERE 0 = 1';

select replace(
    ' OR coalesce(t1.%c, ''!@#'') <> coalesce(t2.%c, ''!@#'')',
    '%c',
    COLUMN_NAME
    )
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'TABLE1' AND COLUMN_NAME <> 'ID'
order by ORDINAL_POSITION;

您可以动态创建查询。这样的东西将为您提供过滤或生成输出的表达式列表。

如果你需要在代码中动态地执行此操作,则必须使用其中一个字符串连接技巧或使用游标。

对于一次性的事情并保存一些打字,您只需抓住结果并从中构建另一个查询。