这里是我用两个表(partoftableY1 & partoftableY2)创建的一个例子,每个表都有不同的数据
/*
create table tableX (column1 int);
insert into tablex
select 1
union all select 2;
create table partoftableY1 (data nvarchar(50));
create table partoftableY2 (data nvarchar(50));
insert into partoftableY1 select 'hey 1 here';
insert into partoftableY2 select 'hey 2 here';
*/
declare @sql nvarchar(max)
-- use the ability of SQL to build up string of all the sql you need to run
set @sql = 'select data from (select '''' as data'
select @sql = COALESCE(@sql + ' union all ', '')
+ 'select data from partoftableY'
+ cast(column1 as nvarchar(4)) from tableX
select @sql = @sql + ') X where data <>'''''
-- DEBUG for seeing what SQL you created
print @sql
-- Now execute the SQL
exec sp_executesql @sql= @sql
这给了我结果
hey 1 here
hey 2 here
您将需要根据数据类型对其进行调整,但这应该会给您主要的想法
这里的参考是创建和执行的 sql:
select data
from (
select '' as data
union all select data from partoftableY1
union all select data from partoftableY2
) X
where data <>''
注意
- 我将其格式化以便于阅读,因为它实际上是作为一长行创建的
- 我使用了选择数据而不是选择 *,因为联合中每个选择的列数需要相同。您将需要选择所需的列,然后进行更改以确保联合中选择的所有列都相同。
- 联合顶部有一个虚拟选择,使联合代码更容易 - 不需要条件作为联合是否都需要呈现
- 我在整个联合上使用了 out 选择,使您能够获得虚拟选择的 sid