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

Sql 插入数据后更改列数据类型,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我目前正在尝试对数据库进行本地化,我的策略是从各个表中取出所有可本地化的字符串,并将它们放入另一个包含StringID、CultureID和LocalizedString的表中,然后StringID在原始表中引用该字符串。问题是,我需要将包含字符串的列的数据类型从varchar更改为int,并将该字符串替换为对LocalizedStrings表的引用 我已经从表中提取了所有字符串,并使用INSERT INTO查询在LocalizedStrings表中创建了条目。我目前为解决我的问题所做的努力如下

我目前正在尝试对数据库进行本地化,我的策略是从各个表中取出所有可本地化的字符串,并将它们放入另一个包含StringID、CultureID和LocalizedString的表中,然后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
然而,由于各种噩梦般的依赖性,我得到了各种各样的异常尝试这样做


我的问题是,有没有更简单的方法?我还考虑过只添加新列,而保留旧列作为临时解决方案,但这相当混乱。

如果您知道所有列都包含整数值,您可以将该列强制转换为整数,然后动态创建另一列。不确定我是否理解正确,但类似于以下内容:

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 如果每个子表也使用StringColumn,则需要对其重复此过程。 您还需要调整所有存储过程、查询和ORM映射以使用新的colulm

然后,当所有内容都已更改时,运行

ALTER TABLE OriginalTable
DROP COLUMN StringColumn

当然,如果需要,也可以在子表上删除该列。

我必须将查询的上半部分和下半部分分成两个查询SQL Server Management Studio不喜欢我在同一个查询中刚刚创建的列上运行查询,但除此之外,这似乎是一种方法,谢谢。
ALTER TABLE OriginalTable
DROP COLUMN StringColumn