微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编写查询以生成一些脚本以重命名整个数据库中的某些列

如何解决编写查询以生成一些脚本以重命名整个数据库中的某些列

我有一个 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');

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

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

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

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

我想要查询或程序来执行此操作。

非常感谢...

解决方法

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

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

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 选项重命名列,然后针对目标数据库发布该项目。发布提供了立即应用更改和/或仅生成脚本的选项。该脚本将包含用于列重命名的 DDL,以及更改所有引用对象中的列名称。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。