2013-06-04 5 views
1

В настоящее время я пытаюсь локализовать базу данных, и моя стратегия включает в себя удаление всех локализуемых строк из моих различных таблиц и помещение их в другую таблицу, содержащую StringID, CultureID и LocalizedString, которые затем ссылается в исходной таблице на StringID. Проблема в том, что мне нужно изменить тип данных столбца, содержащего строку из varchar, на int и заменить строку ссылкой на таблицу LocalizedStrings.Изменение типа столбца после ввода данных

Я уже взял все свои строки из таблицы и создал записи в таблице LocalizedStrings в этой точке, используя запрос INSERT INTO. И мои нынешние усилия, чтобы решить мою проблему выглядеть следующим образом:

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

И конечно Dropp столбец Weather.co.ua исполнился дочерних таблиц также, если это будет необходимо.

+0

Мне пришлось разделить верхнюю и нижнюю половину вашего запроса на два запроса (SQL Server Management Studio не понравилось, что я запускал запрос в столбце, который был только что создан в том же запросе), но в противном случае это похоже на путь, спасибо. – Devo

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 
Смежные вопросы