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