【发布时间】:2016-06-09 09:16:48
【问题描述】:
需要显示来自多个表的所有行。要包含的表将来自单独的查询以确保。所以我们知道数据的来源,必须添加一个包含表名的新列。
要包含在其中的表必须是动态的,以减少维护,因此会自动包含新创建的表。 要选择我创建此查询的表:
select TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'contact_info_type'
and TABLE_NAME NOT LIKE '%test%'
and TABLE_NAME NOT LIKE '%_STAGING'
'contact_info_type' 列的测试是为了确保该表具有预期的结构。所有这些表都完全相同。
但是如何将这些结果传递到新的 select 语句中呢?
我尝试了这个,它产生了重复的结果并且不会停止处理。它还缺少在表名中添加的额外列
declare @tableNames nvarchar(max)
select @tableNames = COALESCE(@tableNames + ', ', '') + Cast(TABLE_NAME as varchar) from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'contact_info_type' and TABLE_NAME not like '%_STAGING' and TABLE_NAME like '%test%'
select @tableNames
declare @sqlText nvarchar(max)
set @sqlText = ''
select @sqlText = @sqlText + 'SELECT * from ' + @tableNames where person = 'Joe'
select @sqlText
每个表将包含几千行,但条件 (name = 'Joe') 会将结果限制在 100 左右。
运行 Server 2008 R2 SP3 (10.50)。
【问题讨论】:
-
distinct table_name? -
您的意思是说所有表结构都将完全相同。包含列contact_info_type 的所有表都必须包含在此查询中。您需要额外的列来说明它属于哪些行。如果是这种情况那么这可以做到。但首先你要做什么?你真正的要求是什么,你为什么要创建这么多表。
-
@KumarHarsh 是的,所有表都具有完全相同的结构。这是我们正在使用的第 3 方系统,它是这样设计的。这个想法是它使用单独的表来保持数据隔离。由于所有这些表的结果将在一个结果集中返回,因此需要知道结果来自哪个表,因此需要一个包含该行所属表名称的新列。
标签: sql sql-server