问题描述
我有一个 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,以及更改所有引用对象中的列名称。
如果该列在视图、过程等中使用不需要的名称作为别名,则这些别名也需要更改。