• 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