【问题标题】:sql rename all column names given a string with new column namessql重命名所有列名给定一个带有新列名的字符串
【发布时间】:2017-10-03 13:24:11
【问题描述】:

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

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

【问题讨论】:

  • 所以主要问题是你不知道如何从这个输出“Col1, Col2, Col3, etc...”中的SCHEMA表中选择?
  • 为什么需要自动化脚本来重命名表中的列?重命名列是很少发生的事情。如果您需要定期执行此操作,那听起来您的设计有很大的错误。
  • @SeanLange 我这里有这个案例stackoverflow.com/questions/8443802/…。但我的情况比那种情况好,因为我有一个带有列名的字符串。
  • 所以你真正需要的是知道如何解析一个分隔字符串?我仍然说这个过程尖叫着事情发生了可怕的错误。
  • 这是我选择的字符串拆分器。 sqlservercentral.com/articles/Tally+Table/72993 它返回每个分隔值的序号位置。这里还有其他几个很棒的选择。 sqlperformance.com/2012/07/t-sql-queries/split-strings

标签: sql sql-server


【解决方案1】:

使用我在此处的 cmets 中引用的 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

我之前已经说过了,我不能凭良心不再提及。您需要这样做的事实是一个巨大的危险信号,表明您管理数据的方式存在非常非常错误的问题。更改列名根本不应该经常发生,只有在绝对需要时才发生。定期执行此操作表明流程或设计确实存在大问题。

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 这很简单。请查看更新的问题。我需要拆分字符串并将其应用于结果。
  • ole.michelsen.dk/blog/… 会给你这些信息
  • 在 sys.columns 查询上运行游标并使用拆分中的标识来创建 sp_rename 字符串
  • 这不是一个很好的拆分器。请参阅我对主要问题的评论以及拆分字符串的更好选择。
  • 为什么是光标?一旦字符串被拆分,我们不需要返回并一一查看每一列。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2016-12-29
  • 2017-11-11
  • 2020-06-07
  • 2021-08-11
  • 2021-08-02
相关资源
最近更新 更多