1

私は現在、データベースをローカライズしようとしています。私の戦略では、さまざまなテーブルからすべてのローカライズ可能な文字列を取り出し、それらを StringID、CultureID、および LocalizedString を含む別のテーブルに配置します。文字列 ID。問題は、文字列を含む列のデータ型を varchar から int に変更し、文字列を LocalizedStrings テーブルへの参照に置き換える必要があることです。

INSERT INTOテーブルからすべての文字列を取得し、この時点でクエリを使用して LocalizedStrings テーブルにエントリを作成しました。そして、私の問題を解決するための現在の取り組みは次のようになります。

SELECT column1, column2, ... 
INTO TempTable
FROM OriginalTable
INNER JOIN LocalizedStrings
ON OriginalTable.StringColumn = LocalizedStrings.LocalizedString

ALTER TABLE OriginalTable
DROP COLUMN StringColumn

ALTER TABLE OriginalTable
ADD NameStringID int

INSERT INTO OriginalTable (NameStringID)
SELECT StringID FROM TempTable

DROP TABLE TempTable

ただし、さまざまな悪夢のような依存関係があるため、これを実行しようとするとあらゆる種類の例外が発生します。

私の質問は、もっと簡単な方法はありますか? また、一時的な回避策として、新しい列を追加して古い列を残すことも検討しましたが、それはかなり面倒です。

4

2 に答える 2

2
ALTER TABLE OriginalTable
ADD NameStringID int

update OT
set NameStringID = LS.NameStringID 
from OriginalTable OT
join LocalizedStrings LS on ls.StringColumn = OT.LocalizedString

StringColumn も使用している場合は、子テーブルごとにこのプロセスを繰り返す必要があります。また、すべてのストアド プロシージャ、クエリ、ORM マッピングを調整して、新しい列を使用する必要があります。

次に、すべてが変更されたら、実行します

ALTER TABLE OriginalTable
DROP COLUMN StringColumn

もちろん、必要に応じて、子テーブルにも列をドロップします。

于 2013-06-04T15:13:26.900 に答える
0

すべての列に整数値が含まれていることがわかっている場合は、列を整数にキャストし、その場で別の列を作成することができます。私があなたを正しく理解しているかどうかはわかりませんが、次のようなものです。

@test テーブルを宣言します(id varchar(50),name varchar(50))

@test に挿入
'1','テスト 1' を選択

@test に挿入
'2','テスト 2' を選択

select *, cast(id as int) as ConvertedToInt into #Result from @test

select * from #Result

テーブルを削除 #結果
于 2013-06-04T15:13:08.393 に答える