数据插入后更改列数据类型

时间:2013-06-04 15:01:15

标签: sql sql-server sql-server-2008

我目前正在尝试本地化数据库,我的策略涉及从我的各种表中取出所有可本地化的字符串,并将它们放入另一个包含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

然而,由于各种噩梦般的依赖关系,我试图做各种各样的例外。

我的问题是,有更简单的方法吗?我还考虑过添加新列并将旧列作为临时解决方法,但这非常混乱。

2 个答案:

答案 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