我目前正在尝试本地化数据库,我的策略涉及从我的各种表中取出所有可本地化的字符串,并将它们放入另一个包含StringID,CultureID和LocalizedString的表中,然后在原始文件中引用tableID由StringID。问题是我需要将包含字符串的列的数据类型从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
然而,由于各种噩梦般的依赖关系,我试图做各种各样的例外。
我的问题是,有更简单的方法吗?我还考虑过添加新列并将旧列作为临时解决方法,但这非常混乱。
答案 0 :(得分: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映射以使用新的colulm。
然后当所有内容都被更改后,运行
ALTER TABLE OriginalTable
DROP COLUMN StringColumn
当然,如果需要,也可以将子列放在子表上。
答案 1 :(得分:0)
如果您知道所有列都包含整数值,那么您可以做的是将列转换为整数,并动态创建另一列。不确定我是否理解正确,但与以下内容类似:
declare @test table(id varchar(50),name varchar(50)) insert into @test select '1','Test 1' insert into @test select '2','Test 2' select *, cast(id as int) as ConvertedToInt into #Result from @test select * from #Result drop table #Result