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 table(id varchar(50),name varchar(50))

插入@test
选择“1”,“测试 1”

插入@test
选择“2”,“测试 2”

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

从#Result中选择*

删除表#Result
于 2013-06-04T15:13:08.393 回答