给定具有列Col1,Col2和Col3的表"ABC",可以自动生成如下内容:
SELECT
Col1 AS 'ABC_Col1',
Col2 AS 'ABC_Col2',
Col3 AS 'ABC_Col3'
FROM ABC
Run Code Online (Sandbox Code Playgroud)
我有一个没有固定列的表(用户能够追加他们自己的列),我仍然需要列前缀(因为在JOIN/CTE中需要它与其他表也有名为Col1,Col2的列等等...)
因此,我希望能够写出这样的东西:
SELECT
T0.* AS 'ABC_T.*',
FROM ABC T0
Run Code Online (Sandbox Code Playgroud)
这当然不是有效的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
Run Code Online (Sandbox Code Playgroud)
从那里它只是一些动态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)
Run Code Online (Sandbox Code Playgroud)
A)这是糟糕的性能(因为它是一个游标)
B) 我知道你不适合为这里的人工作,但我得意忘形了。
C)我什至考虑过不发布这个,因为我觉得这个答案很糟糕,但这至少是一个想法。
| 归档时间: |
|
| 查看次数: |
4076 次 |
| 最近记录: |