Sql 与不存在名称的所有字段名和Null联合

Sql 与不存在名称的所有字段名和Null联合,sql,sql-server,Sql,Sql Server,我正在摆弄这段代码,以查找所有表名以及我需要的所有字段 select t.name, c.name from sys.columns c join sys.tables t on c.object_id = t.object_id where c.name like '%ID%' OR c.name like '%ID1%' OR c.name like '%ID2%' OR c.name like '%ID3%' OR c.name like '%AB

我正在摆弄这段代码,以查找所有表名以及我需要的所有字段

select t.name, c.name
from sys.columns c
join sys.tables t
on c.object_id = t.object_id
where c.name like '%ID%' 
     OR c.name like '%ID1%'
     OR c.name like '%ID2%'
     OR c.name like '%ID3%'
     OR c.name like '%ABC%'
     OR c.name like '%RTG%'
order by c.name
我得到了几百个表名和字段名。基本上,我正试图找出最简单的方法来获得这样的结果:

select col1, col2, col3, null as col4 from table1
union all
select col1, col2, col3, null as col4 from table2
union all
select col1, col2, col3, col4 from table3;

这里的挑战是…我可以输入逻辑,但我要处理数百个表/字段,而且很难硬编码所有这些逻辑。我正在使用SQLServerAzure。思想?思想?建议?

我不知道我是否真的建议这样做,但您可以使用范围界定技巧,使所有子查询基本相同:

select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
     (select a, b, c, d
      from table1
     ) t
union all
select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
     (select a, b, c, d
      from table2
     ) t
. . . 
基本上,子查询将从表中选择值(如果存在)。否则,它将从v获取它们

编辑:

或者正如马丁所指出的:

select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
     ((select a, b, c, d from table1
      ) union all
      (select a, b, c, d from table2
      ) union all
      . . .
     ) t

我不知道我是否真的建议这样做,但您可以使用范围界定技巧,使所有子查询基本相同:

select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
     (select a, b, c, d
      from table1
     ) t
union all
select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
     (select a, b, c, d
      from table2
     ) t
. . . 
基本上,子查询将从表中选择值(如果存在)。否则,它将从v获取它们

编辑:

或者正如马丁所指出的:

select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
     ((select a, b, c, d from table1
      ) union all
      (select a, b, c, d from table2
      ) union all
      . . .
     ) t

这看起来像是XY问题。我非常怀疑您的每个表对所有列都有相同的定义;如果他们没有,那么这本身就是一个设计缺陷。这看起来像是一个XY问题。我非常怀疑您的每个表对所有列都有相同的定义;如果没有,那么这本身就是一个设计缺陷。无需重复values子句。如果所有的结合都是在十字架上完成的,那么它应该对所有人都有好处branches@MartinSmith . . . 我正在试着决定我是否喜欢这两种方法。我的一部分说真的很酷——它实现了联合并填充了缺失的值。另一部分说恶心!太多的范围界定规则。好吧,这肯定是一个黑客,但它做的工作,这对我来说已经足够好了。@asher。我也能理解这种需要。例如,如果这些表表示每周生成的报告,本质上是相同的,但可能会随着时间的推移而变化,这就是为什么它们需要在单独的表中。无需重复values子句。如果所有的结合都是在十字架上完成的,那么它应该对所有人都有好处branches@MartinSmith . . . 我正在试着决定我是否喜欢这两种方法。我的一部分说真的很酷——它实现了联合并填充了缺失的值。另一部分说恶心!太多的范围界定规则。好吧,这肯定是一个黑客,但它做的工作,这对我来说已经足够好了。@asher。我也能理解这种需要。例如,如果表表示每周生成的报告,基本上是相同的,但可能会随着时间的推移而变化,这就是为什么它们需要在单独的表中。