SQL重命名所有列名,给定一个带有新列名称的字符串



我想重命名一个表格的所有列名称,其中包含由逗号分隔的新名称的字符串。这是字符串:

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'''

使用我在此处的评论中引用的杰夫·莫登(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

我以前已经说过这句话,我不能再良心再提及。您需要这样做的事实是一个巨大的危险信号,即您管理数据的方式非常非常错误。更改列的名称绝对不应该经常发生,并且仅在绝对需要时才发生。通常这样做的标志表明该过程或设计确实存在很大的问题。

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

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

相关内容

最新更新