Указание значения и преобразование столбцов во время переноса таблицы?

В настоящее время я переношу данные из одной базы данных в другую.

Моя проблема возникает с недавно разработанной таблицей. Старая таблица состояла из столбцов:

car1, car2, car3, id1, id2, id3, id4, idtxt, idtxt2  
(id types could be the same for multiple rows)  

Строки будут иметь определенную комбинацию для car1, 2, 3 с определенным идентификатором для каждой комбинации. id1 всегда заполнен, а 2,3,4,txt и txt2 могут быть заполнены или не заполнены.

Мои новые столбцы состоят из:

car1, car2, car3, idtype, id#,text

В этой новой таблице idtype = к id1, id2, id3, id4, id5 (idtxt) и id6 (idtxt2), а id# = к значениям строки идентификатора в первой таблице. Это означает, что строк будет больше, чем в старой таблице, поскольку для каждого id# будет строка, даже если они представляют собой одну и ту же комбинацию.

Как бы вы поступили при передаче этой информации через хранимую процедуру?

В настоящее время я могу думать только о запуске нескольких хранимых процедур, которые состоят из вставки в операторы, но, похоже, не могу найти никаких ответов о том, как я буду вставлять определенное значение в дополнение к передаче данных. т.е. (idtype = id1 для всей этой передачи)

Я также убежден, что это не самый эффективный способ.

Скажите, пожалуйста, нужны ли разъяснения. Спасибо!

Изменить, я понял, как вставлять определенные значения во время передачи данных. Другие проблемы/предложения остаются в силе.


person user1512593    schedule 09.07.2012    source источник


Ответы (1)


Если я правильно понимаю, что вы делаете, вы можете сделать это с помощью простого запроса.

Похоже, вы пытаетесь нормализовать данные, взяв поля в первой таблице и развернув их во второй.

select car1, car2, car3, 'id1' as idtype, id1
from t union all
select car1, car2, car3, 'id2', id2
from t union all
select car1, car2, car3, 'id3', id3
from t union all
select car1, car2, car3, 'id4', id4
from t union all
select car1, car2, car3, 'id5', idtxt
from t union all
select car1, car2, car3, 'id2', idtxt2
from t

Вы можете сохранить это в другую таблицу, создав целевую таблицу и вставив ее, или используя «создать таблицу как» или «выбрать в» (в зависимости от используемой базы данных).

Например, если вы создаете таблицу, ваш код будет выглядеть примерно так:

create table <new table in new database> (
    <tablename>id int primary key identity(1,1),
    car1 <some type>,
    ...,
    CreatedBy varchar(256) default system_user,
    CreatedAt datetime default getdate(),
); 

insert into <new table in new database>(car1, car2, car3, idtype, id1)
    <select query above>

Примечание. Для этого я использовал синтаксис SQL Server и добавил три дополнительных столбца: id, CreatedBy и CreatedAt. (Почти) все таблицы должны иметь эти столбцы.

person Gordon Linoff    schedule 09.07.2012
comment
Спасибо за ваш ответ. Кажется, что мясной ход, который вы описываете, предназначен только для просмотра таблицы. Я фактически передаю данные из одной базы данных в другую. Дело в том, что новая база данных решает некоторые проблемы, которые были у старой базы данных. По сути это редизайн. Я не могу изменить старую базу данных с тех пор. - person user1512593; 09.07.2012
comment
Это запрос, который вам нужен, чтобы получить данные в правильном формате. В хранимой процедуре у вас будет что-то вроде create table . . . а затем вставить в t ‹запрос выше›. - person Gordon Linoff; 09.07.2012
comment
Итак, у меня было бы что-то вроде создания таблицы t_create(выберите car1, car2, car3, 'id2', id2 из t_ex) вставьте в t_ex_new (car1,car2,car3, idtype, id) выберите car1,car2,car3 , idtype, id из t_create ? Будет ли это создавать новые таблицы в базе данных? - person user1512593; 09.07.2012
comment
Спасибо за редактирование. Кажется, это очень помогает. Тем не менее, я все еще сталкиваюсь с одной проблемой: нули. Так что не все идентификаторы имели значение. Некоторые были нулевыми. Поэтому, когда я пытаюсь вставить в новую таблицу, возникает ошибка, в которой говорится, что id # равен нулю и не может быть введен. Есть ли способ заставить его пропускать нулевые строки? - person user1512593; 09.07.2012
comment
Первый идентификатор в таблице генерируется автоматически, и вам не следует вставлять в него. Обычно я добавляю к нему имя таблицы (CarInfoID или что-то в этом роде). Дополнительные столбцы не допускают NULL, остальные должны (за исключением, возможно, car1). - person Gordon Linoff; 09.07.2012