【问题标题】:Naming: All caps need to be converted to proper naming convention命名:所有大写字母都需要转换为正确的命名约定
【发布时间】:2012-09-11 08:52:04
【问题描述】:

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

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

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

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

【问题讨论】:

  • @t-clausen.dk 这是一个 SQL Server 系统
  • 您是否考虑过在区分大小写的排序规则服务器上部署时会发生什么?
  • 你把你的术语编造成我喜欢称之为字典的东西。当字典中的一个词是另一个词或一个关键字的词干时,这会变得很棘手。
  • 好问题是:您是否也需要更改 Sql 模块(SP、函数)?如果是,唯一一种识别实体的好方法是使用 TSQL 语言解析库“Microsoft.SqlServer.Management.SqlParser”:link

标签: sql sql-server naming


【解决方案1】:

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

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

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

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

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

【讨论】:

  • +1 表示“游戏得不偿失”。我们已经做了一些工作来自动化这个。我会补充我的问题
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我们找到了解决方案:

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

    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识别为一个单词并生成正确的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多