1

ひどく書かれていますが、合理的なデータ構造を持っています (わずかな変更のみが必要です)。ただし、データベースの命名規則はひどいものです。やりたいことは、のような名前SYSTEMNAMESystemNameEMPLOYEEIDに変換することEmployeeIdです。

この問題に対する現在の解決策はありますか? 私たちは、次のことを行うためのアプローチを考えました。

  • データベースで使用されているすべての既存の単語を発明します ( System, Name, Employee, Id)
  • 単純な検索と置換を実行して大文字と小文字を修正し、SQL ステートメントを使用して変更を適用します

この問題に取り組み、おそらく辞書を含む現在のシステムはありますか? 私たちの意見では既存のソリューションが実行可能であるため、商用アプリケーションにお金を費やすつもりはありません (システムはそれほど大きくなく、テーブルが 30 以下です)。

4

3 に答える 3

1

そのようなシステムが存在するかどうかはわかりません。あなたの要件は非常にまれなので、あなたの場合(小さなシステム)では、ゲームはろうそくの価値がないと思います。

DBをSQLServerから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 に答える