The only way I can think of is a stored procedure with dynamic sql:
-- SETUP
CREATE TABLE TableA (
id int PRIMARY KEY CLUSTERED,
[1] int,
[2] int,
[3] int,
[4] int,
[5] int,
[6] int,
[7] int,
[8] int,
[9] int,
[10] int
)
CREATE TABLE TableB (
id int PRIMARY KEY CLUSTERED,
[1] int,
[3] int,
[4] int,
[5] int,
[8] int,
[9] int,
[10] int,
[11] int,
[12] int
)
CREATE TABLE TableC (
id int PRIMARY KEY CLUSTERED,
[1] int,
[2] int,
[3] int,
[5] int,
[6] int,
[7] int,
[9] int,
[11] int,
[12] int,
[13] int
)
ALTER PROCEDURE unionTables
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql nvarchar(max)
SELECT @sql = STUFF((
SELECT ',' + QUOTENAME(name) AS [text()]
FROM sys.columns
WHERE object_id IN (
OBJECT_ID('TableA'),
OBJECT_ID('TableB'),
OBJECT_ID('TableC')
)
GROUP BY name
HAVING COUNT(*) = 3
FOR XML PATH('')
),1,1,SPACE(0))
SELECT @sql = STUFF((
SELECT 'UNION ALL ' + char(10) + 'SELECT ' + @sql + ' FROM ' + name + CHAR(10) AS [text()]
FROM sys.tables
WHERE object_id IN (
OBJECT_ID('TableA'),
OBJECT_ID('TableB'),
OBJECT_ID('TableC')
)
FOR XML PATH('')
),1,10,SPACE(0))
EXEC(@sql)
END
-- Gianluca Sartori