命名:所有大写字母都需要转换为正确的命名约定



我们有一个遗留应用程序,它写得很糟糕,但数据结构合理(只需要稍微修改)。然而,数据库中的命名约定非常糟糕。我们要做的是将SYSTEMNAME转换为SystemName,将EMPLOYEEID转换为EmployeeId

这个问题目前有解决方案吗?我们已经想到了一种方法来做以下事情:

  • 发明数据库中使用的所有现有单词(SystemNameEmployeeId
  • 使用SQL语句进行简单的查找和替换以更正大小写并应用更改

目前有没有一个系统可以解决这个问题,并且可能包含一本字典?不愿意在商业应用上花钱,因为在我们看来,现有的解决方案是可行的(系统不是很大,大约有30张表)。

我不知道这样的系统是否存在。你的要求太少了,所以我认为在你的情况下(小系统),这个游戏不值得。

当我需要将数据库从SQL Server移动到Oracle时,我需要重命名实体。我的系统更大:它有300多个表和200多个其他实体。我做了什么:

  1. 创建文件以将旧名称映射到新名称
  2. 准备分析TSQL模块定义并将名称从旧改为新的脚本。(最好使用TSQL语言解析库)

我的脚本是用Powershell编写的,有一些特定的企业逻辑,所以我不能把它放在这里。

我的建议是:为了确保你会做得好,试着生成重新创建的数据库脚本,然后更改名称。

不可能知道大写字母放在哪里。当然,一些猜测会有所帮助。但为了确保这一点,您需要手动检查的值

这个脚本将为您提供所有字段和表的骆驼大小写:

select b.table_schema + '.'+a.table_name+'.'+column_name tablecolumn, 
  upper(left(column_name, 1))+ lower(stuff(column_name, 1,1,'')) newcolumn
into #t
from INFORMATION_SCHEMA.COLUMNS a
join 
INFORMATION_SCHEMA.TABLES b
on a.table_name = b.table_name
and b.table_type = 'base table'
insert #t
select table_schema + '.' + table_name tablecolumn, 
  upper(left(table_name, 1))+ lower(stuff(table_name, 1,1,'')) newcolumn
from INFORMATION_SCHEMA.TABLES

在这里,您可以从#t中选择*,并在运行此脚本的最后一部分之前将值操作为所需的值。

-- here is an example how you can replace columns like 
-- SYSTEMNAME to SystemName, and EMPLOYEEID to EmployeeId in the temporary table
update #t set newcolumn = replace(replace(newcolumn, 'name', 'Name'), 'id', 'Id')

--loop cursor
Declare @tablecolumn as nvarchar(500)
Declare @newcolumn as nvarchar(500)
Declare SqlCursor CURSOR FAST_FORWARD FOR
SELECT tablecolumn, newcolumn FROM #t
OPEN SqlCursor
FETCH NEXT FROM SqlCursor
INTO @tablecolumn, @newcolumn
WHILE @@FETCH_STATUS = 0
BEGIN
     -- This is the actual renaming
     EXEC sp_rename @tablecolumn, @newcolumn
     FETCH NEXT FROM SqlCursor
     INTO @tablecolumn, @newcolumn
END
CLOSE SqlCursor
DEALLOCATE SqlCursor
drop table #t

我们得到了解决方案:

我们能够建立一个按长度升序排列的表和列名列表:

Type         Value
Column       NAME
Table        EMPLOYEE
Column       SYSTEMNAME
Column       EMPLOYEEID
Column       SYSTEMNAMEEMPLOYEEIDBLABLA

然后,该算法分析每个名字,并建立一个已知单词列表

Input          Output         Word List (ordered by length descending)
NAME           Name           Name
EMPLOYEE       Employee       Name, Employee
SYSTEMNAME     SystemName     Name, System, Employee
EMPLOYEEID     EmployeeId     Id, Name, System, Employee
.. and so forth.. 

这使我们达到了大约95%的

由于无法识别的单词,某些字段仍然不正确。(在这种情况下,BLABLA将变为Blabla,而我们可能更喜欢BlaBla

因此,我们可以添加到输入文件:

Type         Value
Word         BLA
Column       NAME
Table        EMPLOYEE
Column       SYSTEMNAME

然后它将把Bla识别为一个单词并产生正确的输出。