在给定带有新列名的字符串的情况下,sql重命名所有列名

时间:2017-10-03 13:24:11

标签: sql sql-server

我想重命名表的所有列名,给定一个用逗号分隔的新名称的字符串。这是字符串:

declare @str varchar(max)='A,B,C'

表中的列数可能会有所不同,并且适当地是字符串中的名称数。因此,在5列表中,字符串将为'A,B,C,D,E'

我有一个列名为:

的表
col1 | col2 | col3

并且在预期结果中我希望:

A | B | C

更新 我试图遵循这条道路:

SELECT 
 ORDINAL_POSITION
,COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
TABLE_NAME = 'my_temp'
order by ORDINAL_POSITION asc

但我不知道如何拆分@sql字符串,以便它可以通过以下方式应用于结果:

ORDINAL_POSITION  COLUMN_NAME  sql_string  
1                 Col1         A  
2                 Col2         B  
3                 Col3         C   

然后我可以轻松地创建一个字符串,如:

dynamic_sql='EXEC sp_rename my_table.' + COLUMN_NAME +',' + sql_string +', ''COLUMN'''

2 个答案:

答案 0 :(得分:2)

使用Jeff Moden的分割器我在这里的评论中引用了你的问题的答案,你可以轻松地做到这一点。 http://www.sqlservercentral.com/articles/Tally+Table/72993/

这是一个完整的工作示例。如果您可以在问题中发布样本表,那将非常有帮助,因此我们无需这样做就可以解决问题。

if object_id('SomeTable') is not null
    drop table SomeTable

create table SomeTable
(
    Col1 int
    , Col2 int
    , Col3 int
)

--to demonstrate the column names before we change them
select * from SomeTable

declare @NewNames varchar(100) = 'A,B,C'
    , @SQL nvarchar(max) = ''

select @SQL = @SQL + 'EXEC sp_rename ''SomeTable.' + c.name + ''', ''' + s.Item +''', ''COLUMN'';'
from sys.columns c
join dbo.DelimitedSplit8K(@NewNames, ',') s on s.ItemNumber = c.column_id
where object_id = object_id('SomeTable')


select @SQL
--exec sp_executesql @SQL

--demonstrates the column names have been changed.
select * from SomeTable

我以前说过这个,我不能在良心上再也不提它。您需要执行此操作的事实是一个巨大的红旗,您管理数据的方式存在非常严重的问题。更改列名不应该经常发生,并且只有在绝对需要时才会发生。经常这样做表明过程或设计确实存在很大问题。

答案 1 :(得分:0)

这将以正确的顺序为您提供现有表的所有列的名称

select c.name
  from sys.columns c
    inner join sys.objects o on c.object_id = o.object_id 
 where o.name = 'name_of_table'
 order by c.column_id