我想重命名表的所有列名,给定一个用逗号分隔的新名称的字符串。这是字符串:
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'''
答案 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