首页 > 解决方案 > 编写查询以生成一些脚本以重命名整个数据库中的某些列

问题描述

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

如果有更好的方法让我知道。

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

太感谢了 ...

标签: sqlsql-serverssmssql-server-2019

解决方案


尽管使用 重命名表列并不困难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 选项重命名列,然后针对目标数据库发布项目。Publish 提供了立即应用更改和/或仅生成脚本的选项。该脚本将包含用于列重命名的 DDL,就像更改所有引用对象中的列名称一样。

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


推荐阅读