给定一个带有Col1,Col2和Col3列的“ABC”表,可以自动生成如下内容:
SELECT
Col1 AS 'ABC_Col1',
Col2 AS 'ABC_Col2',
Col3 AS 'ABC_Col3'
FROM ABC
我有一个没有固定列集的表(用户可以附加自己的列),我仍然需要列前缀(因为在JOIN / CTE中需要它与其他表也有列名称的列Col1,Col2等......)
因此,我希望能够写出这样的内容:
SELECT
T0.* AS 'ABC_T.*',
FROM ABC T0
这当然不是有效的SQL,但可以某种方式完成,所以“*”列都获得相同的前缀吗?
答案 0 :(得分:3)
这将为您提供旧列名和新列名的映射:
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)我认为甚至没有发布这个,因为我觉得它的答案有多差,但这不是一个想法。
答案 1 :(得分:2)
您似乎对列别名的作用感到困惑。正如您在select
子句中所看到的那样,您只能通过引用T0
从T0.*
中选择字段。您仍然可以在查询中稍后将这些字段引用为T0.<whatever>
,而不对字段进行别名,您只需要通过其完整字段名称来引用它们,即T0.[My Users Suck And Make Really Long Field Names]
。
编辑:为了更清楚,您不能通过别名来更改字段的前缀。您只能更改它的名称。字段的前缀是它来自的表的别名。
答案 2 :(得分:0)
我认为你能够做到这一点的唯一方法是创建一些动态SQL。