Sql server 在T-SQL语句中为所有列添加前缀

Sql server 在T-SQL语句中为所有列添加前缀,sql-server,tsql,Sql Server,Tsql,给定一个包含Col1、Col2和Col3列的表“ABC”,可以自动生成如下内容: SELECT Col1 AS 'ABC_Col1', Col2 AS 'ABC_Col2', Col3 AS 'ABC_Col3' FROM ABC 我有一个没有固定列集的表(用户可以附加他们自己的列),其中我仍然需要列前缀(因为它在与其他表的联接/CTE中需要,这些表也有名称为Col1、Col2等的列) 因此,我希望能够写出这样的内容: SELECT T0.* AS 'ABC_T.*', FROM ABC

给定一个包含Col1、Col2和Col3列的表“ABC”,可以自动生成如下内容:

SELECT
Col1 AS 'ABC_Col1', 
Col2 AS 'ABC_Col2',
Col3 AS 'ABC_Col3' 
FROM ABC
我有一个没有固定列集的表(用户可以附加他们自己的列),其中我仍然需要列前缀(因为它在与其他表的联接/CTE中需要,这些表也有名称为Col1、Col2等的列)

因此,我希望能够写出这样的内容:

SELECT
T0.* AS 'ABC_T.*', 
FROM ABC T0

这当然不是有效的SQL,但是否可以通过某种方式使“*”列都具有相同的前缀?

您似乎对列别名的作用感到困惑。正如您在
select
子句中所看到的,您已经通过引用
T0.*
只从
T0
中选择了字段。您仍然可以将这些字段引用为
T0。
稍后在您的查询中,无需对字段使用别名,您只需通过其完整字段名引用它们,即
T0。[我的用户很烂,字段名很长]


编辑:更清楚地说,不能通过别名更改字段的前缀。您只能更改它的名称。该字段的前缀是它所来自的表的别名。

我认为实现这一点的唯一方法是创建一些动态SQL。

这将为您提供旧列名和新列名的映射:

SELECT syscolumns.name as old_column_name, 'ABC_' + syscolumns.name as new_column_name
   FROM sysobjects 
        JOIN syscolumns ON sysobjects.id = syscolumns.id
   WHERE sysobjects.name = 'ABC'
ORDER BY sysobjects.name,syscolumns.colid
从这里开始,它只是一些动态sql。我还在玩它

编辑

好吧,我放弃了

DECLARE @sql varchar(max)
SET @sql = 'SELECT '

DECLARE @old_column_name varchar(50)
DECLARE @getNext CURSOR
SET @getNext = CURSOR FOR 
    SELECT syscolumns.name
       FROM sysobjects 
            JOIN syscolumns ON sysobjects.id = syscolumns.id
       WHERE sysobjects.name = 'ABC'
OPEN @getNext
FETCH NEXT FROM @getNext INTO @old_column_name
WHILE @@fetch_status = 0
BEGIN

    --BUILD DYNAMIC SQL
    SET @sql = @sql + @old_column_name + ' AS ''ABC_' + @old_column_name + ''', '

FETCH NEXT FROM @getNext INTO @old_column_name
END
CLOSE @getNext
DEALLOCATE @getNext

--REMOVE FINAL COMMA AND ADD TABLE
SET @sql = SUBSTRING(@sql, 0, LEN(@sql)) + ' FROM ABC'

exec(@sql)
A) 这是一个糟糕的性能(因为它是一个游标)

B) 我知道你不该为这里的人做事,但我被迷住了


C) 我甚至考虑不发布这篇文章,因为我觉得这是一个多么糟糕的答案,但这至少是一个想法。

你想评论一下吗?我在这里所说的一切都是正确的。@Donnie:很可能有人的战术下降,我知道T0.*可以作为参考。但正如我提到的,这个示例稍后将用于更高级的联接和公共表表达式(CTE)。届时将出现T0、T1、T2等字段,其中一些字段具有相同的列名。。在JOIN*中仍然有效,但在CTE中不可能有两个相同的列名…感谢您的努力。。我希望有另一种方法,而不是动态sql(既然没有,我就不打算走这条路了)。。。