【问题标题】:Writing a query to generate some scripts to rename some columns in entire database编写查询以生成一些脚本以重命名整个数据库中的某些列
【发布时间】:2021-03-02 12:06:53
【问题描述】:

我有一个 SQL Server 2019 数据库(一个很大的)。这个数据库有大约 3000 列和大约 200 个表,对于每个表,我们至少有 3 个存储过程。

无论如何,我们在这个数据库中有一些以小写字母开头的列,例如userID。他们应该是UserID。我的老板说我们应该重命名所有这些列。我使用Select 语句来查找这些列。

代码如下:

select * from information_schema.columns where ascii(left(column_name, 1)) between ascii('a') and ascii('z');

所以我有 Column Name , Table Name 和 Schema Name 。 我想要一个查询来生成一些脚本来重命名整个数据库中以大写字母开头的这些列。(过程、表、视图和.....)

查询应该生成这样的脚本:

Alter [sch].[tableName] Alter Column ColumnName INT

如果有更好的方法,请告诉我。

我希望查询或过程执行此操作。

非常感谢...

【问题讨论】:

  • 要重命名对象,您需要使用sys.sp_rename,而不是ALTERsp_rename (Transact SQL).
  • 但是,如果您的数据库采用不区分大小写的排序规则,为什么这很重要? UserIDuserIdUSERID 都会成功引用该列。但是,如果您使用区分大小写的排序规则,这将是一个巨大的突破性变化。
  • 使用您的查询为需要更改的每一列生成带有sys.sp_rename 的行,然后复制所有行并将它们粘贴到 SSMS 中
  • 这能回答你的问题吗? rename a column in all the tables - SQL
  • 你需要培养的一项技能是在互联网上搜索有用的信息。

标签: sql sql-server ssms sql-server-2019


【解决方案1】:

虽然使用sp_rename 重命名表列并不困难,但如果没有工具的帮助,更改引用视图和存储过程并非易事。

下面的 T-SQL 将生成脚本来重命名所有以小写字母开头的列。但是,当存在强制依赖项(例如模式绑定对象)时重命名将失败,并且不会处理视图、procs,因此它是脆弱的。等。人。

SELECT 
      N'EXEC sp_rename ''' 
    + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name) + N'.' + QUOTENAME(c.name) 
    + ''', ''' + UPPER(LEFT(c.name, 1)) + SUBSTRING(c.name,2,127) + ''', ''COLUMN'';'
FROM sys.schemas AS s
JOIN sys.tables AS t ON t.schema_id = s.schema_id
JOIN sys.columns AS c ON c.object_id = t.object_id
WHERE 
    LEFT(c.name, 1) COLLATE Latin1_General_CS_AS <> UPPER(LEFT(c.name, 1)) COLLATE Latin1_General_CS_AS
    AND t.is_ms_shipped = 0;

我建议您使用 SSDT,它包含在 Visual Studio 2019(包括免费社区版)中。创建一个新的 SQL Server 数据库项目,导入现有数据库,使用 Refactor-->Rename 选项重命名列,然后针对目标数据库发布项目。 Publish 提供了立即应用更改和/或仅生成脚本的选项。该脚本将包含用于列重命名的 DDL,就像更改所有引用对象中的列名称一样。

如果该列在视图、进程等中使用了不需要的名称,则这些别名也需要更改。

【讨论】:

  • 我想要一个查询来为我的 Select 语句的每条记录生成 Alter 脚本,格式如下: ALTER TABLE [TableName] RENAME COLUMN [OldColumnName] TO [NewColumnName];或像这样: ALTER TABLE TableName CHANGE COLUMN OldColumnName NewColumnName 数据类型;旧的 [Old_Column_Name] 以小写字母开头,因此 [New_Column_Name] 应以大写字母开头。例如:旧名称 = 用户 ===> 新名称 = 用户
  • RENAME COLUMN 不是有效的 T-SQL,@ImanS3。请参阅我 2~ 小时前在您的问题下写的comments
  • 'STRING_AGG' 不是可识别的内置函数名称。 @DanGuzman
  • @Larnu 是的,我明白了。我有这样的代码:选择 'EXEC sp_rename '''+TABLE_SCHEMA+'.'+TABLE_NAME+'.'+COLUMN_NAME+''', '''+CHAR( ASCII(LEFT(COLUMN_NAME,1))-32 ) + SUBSTRING (COLUMN_NAME,2,LEN(COLUMN_NAME))+''', ''COLUMN''; ' 来自 information_schema.columns 其中 ascii(left(column_name, 1)) 在 ascii('a') 和 ascii('z') 之间;它有效,但我想在 .sql 文件中写入选择输出记录。
  • 这是您的 SSMS 版本 @ImanS3 ,与您使用的 SQL Server 版本无关。 SSMS 只是 SQL Server 的一个 IDE。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
相关资源
最近更新 更多