1

我们有一个遗留应用程序,它编写得非常糟糕,但具有合理的数据结构(只需要稍作修改)。然而,数据库中的命名约定很糟糕。我们要做的是将名称转换SYSTEMNAMESystemName,EMPLOYEEIDEmployeeId.

目前有解决这个问题的方法吗?我们已经想到了一种方法来执行以下操作:

  • 列出数据库中使用的所有现有单词 ( System, Name, Employee, Id)
  • 使用 SQL 语句进行简单的查找和替换以更正大小写并应用更改

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

4

3 回答 3

1

我不知道这样的系统是否存在。你的要求是如此罕见,所以我认为在你的情况下(小系统)游戏是得不偿失的。

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

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

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

我的建议是:为确保一切顺利,请尝试生成重新创建数据库脚本,然后更改名称。

于 2012-09-11T10:16:55.990 回答
0

我们得到了解决方案:

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

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喜欢)BlablaBlaBla

因此我们可以在输入文件中添加:

Type         Value
Word         BLA
Column       NAME
Table        EMPLOYEE
Column       SYSTEMNAME

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

于 2012-09-11T13:59:48.947 回答
0

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

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

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
于 2012-09-11T10:36:47.640 回答