如何在 SQL 服务器中执行 SELECT * 以同时获取具有 table 名称和字段的别名

How to perform SELECT * in SQL Server to get alias with table name and field at the same time

是否可以使用 SELECT * 或类似的一些简单方法在别名中获取 table 名称以及字段名称?

不同 table 中字段的名称相同。

CREATE TABLE table1 (field1 INT, field2 INT)
CREATE TABLE table2 (field1 INT, field2 INT)
CREATE TABLE table3 (field1 INT, field2 INT)

如果我运行一个SELECT *命令

SELECT *
FROM table1, table2, table3

我得到了这种结果(示例数据仅显示第一行):

field1 field2 field1 field2 field1 field2
-----------------------------------------
1      1      1      1      2      1   

但我想得到这个:

table1.field1 table1.field2 table2.field1 table2.field2 table3.field1 table3.field2
-----------------------------------------------------------------------------------
1             1             1             1             2             1             

在此示例中,我可以使用别名更快地更好地识别不同的值 table3.field1

注意: 我不需要将 SELECT * FROM 更改为 SELECT table1.*, table2.*, table3.* FROM。在真实情况下,我有近 20-30 个不同的 table,每个字段都有近 10 个字段。所以对我没用。

我相信这只能使用基于 information_schema 构建列列表的动态 SQL 来完成。类似于:

CREATE TABLE table1 (field1 INT, field2 INT)
CREATE TABLE table2 (field1 INT, field2 INT)
CREATE TABLE table3 (field1 INT, field2 INT)

DECLARE @tables TABLE (seq INTEGER IDENTITY(1,1), name SYSNAME)
INSERT @tables VALUES ('table1'), ('table2'), ('table3')

DECLARE @sql NVARCHAR(MAX) =
    'SELECT '
    + STUFF((
        SELECT ', [' + C.TABLE_NAME + '.' + C.COLUMN_NAME + '] = [' + C.TABLE_NAME + '].[' + C.COLUMN_NAME + ']'
        FROM @tables T
        JOIN INFORMATION_SCHEMA.COLUMNS C ON C.TABLE_NAME = T.name AND C.TABLE_SCHEMA = 'dbo'
        ORDER BY T.seq, C.ORDINAL_POSITION
        FOR XML PATH('')
        ), 1, 2, '')
    + CHAR(10) + 'FROM '
    + STUFF((
        SELECT ', [' + T.name + ']'
        FROM @tables T
        ORDER BY T.seq
        FOR XML PATH('')
        ), 1, 2, '')

INSERT table1 VALUES (1, 2), (3, 4)
INSERT table2 VALUES (5, 6)
INSERT table3 VALUES (7, 8), (9, 10)

PRINT @sql
EXEC (@sql)

DROP TABLE table1
DROP TABLE table2
DROP TABLE table3

生成SQL

SELECT [table1.field1] = [table1].[field1], [table1.field2] = [table1].[field2], [table2.field1] = [table2].[field1], [table2.field2] = [table2].[field2], [table3.field1] = [table3].[field1], [table3.field2] = [table3].[field2]
FROM [table1], [table2], [table3]

输出

table1.field1 table1.field2 table2.field1 table2.field2 table3.field1 table3.field2
1 2 5 6 7 8
1 2 5 6 9 10
3 4 5 6 7 8
3 4 5 6 9 10

FOR XML PATH('') 结构是一种方便的(如果没有混淆)连接结果的方法。 STUFF() 用于剥离第一个 comma/space。如果您使用 dbo 以外的模式,则需要对上述内容进行一些改进才能将其考虑在内。我预计还需要更智能的 JOIN 逻辑。