2012-09-11 20 views
1

我們有一個遺留應用程序,它是非常寫入,但有一個合理的數據結構(只需要稍作修改)。然而數據庫中的命名約定是可怕的。我們想要做的是將名稱如SYSTEMNAME轉換爲SystemName,EMPLOYEEIDEmployeeId命名:所有上限需要轉換爲適當的命名約定

目前有解決這個問題的方法嗎?我們已經想到了一個方法來做到以下幾點:

  • Inventarise數據庫中使用所有現有的字(SystemNameEmployeeId
  • 做一個簡單的查找和替換糾正外殼和應用更改使用SQL語句

是否有當前系統可用的方法這個問題,也許包含字典嗎?由於我們認爲現有的解決方案是可行的(系統不是很大,大約30張桌子),所以不願意花錢在商業應用上。

+0

哪個RDMS是這個? –

+0

@ t-clausen.dk這是一個SQL Server系統 – Bas

+0

您是否考慮過在部署在區分大小寫的整理服務器上時會發生什麼? –

回答

1

我不知道這樣的系統是否存在。你的要求是非常罕見的,所以我認爲 在你的情況下(小系統)遊戲是不值得的蠟燭。

當我需要將DB從SQL Server移動到Oracle我需要重命名實體。我的系統更大:它擁有超過300個表格和超過200個其他實體。 我做了什麼:

  1. 創建文件以將舊名稱映射到新名稱。
  2. 準備分析TSQL模塊定義並將名稱從舊更改爲新的腳本。 (最好使用TSQL語言分析庫)。

我的腳本是用Powershell編寫的,有一些特定的企業邏輯,所以我不能把它放在這裏。

我的建議是:確定你會做得很好,嘗試生成重新創建數據庫腳本,然後更改名稱。

+0

+1爲'遊戲不值得蠟燭'。我們已經做了一些工作來實現這一點。我會加上我的問題 – Bas

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 
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爲一個單詞,產生正確的輸出。