首页 > 解决方案 > 用列名中的下划线动态替换空格

问题描述

我正在尝试用下划线动态替换列名中的空格。到目前为止,我已经编写了以下代码,但是,此代码使用实际的 REPLACE 语句作为字符串更新新列名,而不是将其替换为函数:

select b.column_id,b.name
into #container2
from sys.tables a
join sys.columns b
    on a.object_id = b.object_id
where a.name = 'my_table'

declare @id int
declare @columnName varchar(255)
declare @sql varchar(max)

set @id = 1
select @columnname = name from #container2 where column_id = @id

while @id <= 73
begin

    set @sql = 'EXEC sp_RENAME ''db.my_table.[' + @columnName + ']'', ''REPLACE([' + @columnName + '], '''' '''', ''''_'''')'', ''COLUMN''' 
    print @sql
    --exec(@sql)

    set @id = @id + 1
    select @columnname = name from #container2 where column_id = @id
end

我曾尝试将我的 REPLACE 语句移到我的新列字符串之外,但出现了错误。

我的预期结果是:

old column name: Apple Pie
new column name: Apple_Pie

标签: sqlsql-servertsql

解决方案


Martin Smith 是 100% 正确的……即使假设有很多列要重命名。

像这样的批发变化可能会导致问题、混乱和冲突。

也就是说,这里有一些动态 SQL,您可以谨慎执行。请注意,我正在打印 SQL 而不是执行它。

例子

Declare @SQL varchar(max) = ''

Select @SQL = @SQL + 'EXEC sp_rename '''  + quotename(table_name)+'.' + quotename(column_name) +''',''' + replace(column_name,' ','_') + ''';'+char(13) 
  From INFORMATION_SCHEMA.COLUMNS
  Where charindex(' ',Column_Name)>0
    and table_name = 'SomeDesiredTableName'

Print @SQL
--Exec(@SQL)

推荐阅读