动态 T-sql 比较列值

Dynamic T-sql compare column values

我需要比较 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

有太多列 n 表无法通过这种方式完成...

我的动态SQL查询->

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

我的问题类似于 ref

我正在使用 SQL Server 2008

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;

您可以动态创建查询。类似这样的内容将为您提供用于过滤或生成输出的表达式列表。

如果您需要在代码中动态执行此操作,您要么必须使用一种字符串连接技巧,要么使用游标。

对于一次性的事情并节省一些输入,您只需获取结果并从中构建另一个查询。