Here's one way to generate a select list and eliminate duplicate columns in both tables. It assumes you already know the two tables and the relationship between them. THis uses AdventureWorks and the tables Sales.SalesOrderDetail and Sales.SalesOrderHeader. Note that columns in multiple tables with the same name are not necessarily redundant - for example an order may be modified independently of the order detail items, and now your query both (a) ignores the detail level modified dates, and (b) doesn't make it clear in the results which modified date has been exposed (unless the user reads the query text, if they have access to it).
DECLARE @sql nvarchar(max);
;WITH l AS
(
SELECT column_id, name FROM sys.columns
WHERE [object_id] = OBJECT_ID(N'Sales.SalesOrderDetail')
),
r AS
(
SELECT column_id, name FROM sys.columns
WHERE [object_id] = OBJECT_ID(N'Sales.SalesOrderHeader')
)
SELECT @sql = STUFF((SELECT N',' + CHAR(13) + CHAR(10) + CHAR(9)
+ CASE WHEN l.column_id IS NOT NULL THEN 'h.'
ELSE 'd.' END + QUOTENAME(COALESCE(l.name,r.name)) FROM r
FULL OUTER JOIN l
ON l.name = r.name
ORDER BY COALESCE(l.column_id, 255), r.column_id
FOR XML PATH(''),
TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, N'');
SELECT @sql = N'SELECT ' + @sql + '
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID;'
PRINT @sql;
-- EXEC sys.sp_executesql @sql;
Results:
SELECT
h.[SalesOrderID],
d.[SalesOrderDetailID],
d.[CarrierTrackingNumber],
d.[OrderQty],
d.[ProductID],
d.[SpecialOfferID],
d.[UnitPrice],
d.[UnitPriceDiscount],
d.[LineTotal],
h.[rowguid],
h.[ModifiedDate],
h.[RevisionNumber],
h.[OrderDate],
h.[DueDate],
h.[ShipDate],
h.[Status],
h.[OnlineOrderFlag],
h.[SalesOrderNumber],
h.[PurchaseOrderNumber],
h.[AccountNumber],
h.[CustomerID],
h.[SalesPersonID],
h.[TerritoryID],
h.[BillToAddressID],
h.[ShipToAddressID],
h.[ShipMethodID],
h.[CreditCardID],
h.[CreditCardApprovalCode],
h.[CurrencyRateID],
h.[SubTotal],
h.[TaxAmt],
h.[Freight],
h.[TotalDue],
h.[Comment]
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID;