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

时间:2012-09-11 08:52:04

标签: sql sql-server naming

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

这个问题目前有解决方案吗?我们已经考虑过采取以下措施:

  • 制作数据库中使用的所有现有字词(SystemNameEmployeeId
  • 执行简单的查找和替换以更正外壳并使用SQL语句应用更改

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

3 个答案:

答案 0 :(得分:1)

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

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

  1. 创建文件以将旧名称映射为新名称。
  2. 准备分析TSQL模块定义的脚本,并将名称从旧更改为新。 (最好使用TSQL语言解析库)。
  3. 我的脚本是用Powershell编写的,并且有一些特定的企业逻辑,所以我不能把它放在这里。

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

答案 1 :(得分: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

答案 2 :(得分: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将成为Blabla,而我们可能更喜欢BlaBla

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

Type         Value
Word         BLA
Column       NAME
Table        EMPLOYEE
Column       SYSTEMNAME

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

相关问题