Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Из одной таблицы в три связанные  [new]
NBC
Guest
Есть excel с данными. Для примера поля N1, N2, N3, B4, B5, C6, C7
Ключевого поля нет.

Мне нужно перелить эти строки в БД в 3 связанные таблицы (N / B / C), которые связаны один к многим, N=>B=>C

Вопрос: без курсора реально ???
1 фев 13, 16:32    [13862977]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Курсор тут вообще ни причем.
Если задача единоразовая, то
http://msdn.microsoft.com/ru-ru/library/ms141209%28v=sql.105%29 .
1 фев 13, 16:38    [13863015]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Перелить всё в одну таблицу, а потом разбить.
1 фев 13, 16:39    [13863023]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
NBC
Guest
Перелить то не проблема, я не совсем понимаю как разбить.


На данный момент я себе представляю процедуру так:

- есть строка: N1, N2, N3, B4, B5, C6, C7

- инсерт строки с полями N1, N2, N3 в таблицу N
- получаю SCOPE_IDENTITY вставленной записи из N
- инсерт в таблицу B, поля B4, B5 + ID_N
- получаю SCOPE_IDENTITY вставленной записи из B
- инсерт в таблицу C полей С6, С7 + ID_B
- commit
1 фев 13, 17:04    [13863217]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Может, что-то типа такого:

SELECT DISTINCT N1, N2, N3 INTO N FROM Sheet1$
SELECT DISTINCT N1, B4, B5 INTO B FROM Sheet1$
SELECT B4, C6, C7 INTO C FROM Sheet1$


где ключевые поля N1, B4.
1 фев 13, 17:06    [13863232]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
NBC
Guest
С ключевыми полями не получится, нужно примерно вот что:

select 'Ivanov'as[fio], '10.01.1950'as[birth], '4956789'as[phone] union 
select 'Ivanov', '20.11.1976', '123321' union 
select 'Petrov', '23.12.1784', NULL union
select 'Sidorov', '26.12.1888', '7657875' union
select 'Sidorov', '12.04.1756', NULL

--разбить на три таблицы

--[ID_FIO], [fio]

--[ID_FIO], [ID_BIRTH], [birth]

--[ID_PHONE],[ID_BIRTH], [phone]
1 фев 13, 17:35    [13863437]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
Glory
Member

Откуда:
Сообщений: 104751
NBC
С ключевыми полями не получится,

Что мешает создать искусственный ключ ?
1 фев 13, 17:38    [13863454]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
NBC
Guest
Glory
NBC
С ключевыми полями не получится,

Что мешает создать искусственный ключ ?


Ничего не мешает :)

Только таблицы, в которые нужно перелить файл уже работают, туда заносят данные. Этот файл (а таких много) нужно дописать к существующим данным.

Тогда придется в двух таблицах создать еще по одному полю и сохранять туда искуственно сгенерированный ключ ?
1 фев 13, 17:50    [13863535]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
Exproment
Member

Откуда:
Сообщений: 416
NBC, если я вас правильно понял, то примерно так:

1) открывается транзакция
2) находится максимальное значение инкремента(далее - num) в серилизуемой(вроде) транзакции - чтоб пока все не вставится, никто не мог вставить новое значение
3) затем ваш набор из экселя нумеруете с помощью num+row_number() over(order by любое поле)
4) отключается identity insert на таблицах источниках
5) вставляете записи(ключи у вас уже есть из пункта 3)
6) закрываете транзакцию
1 фев 13, 20:19    [13864114]     Ответить | Цитировать Сообщить модератору
 Re: Из одной таблицы в три связанные  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
NBC
С ключевыми полями не получится, нужно примерно вот что:

select 'Ivanov'as[fio], '10.01.1950'as[birth], '4956789'as[phone] union 
select 'Ivanov', '20.11.1976', '123321' union 
select 'Petrov', '23.12.1784', NULL union
select 'Sidorov', '26.12.1888', '7657875' union
select 'Sidorov', '12.04.1756', NULL

--разбить на три таблицы

--[ID_FIO], [fio]

--[ID_FIO], [ID_BIRTH], [birth]

--[ID_PHONE],[ID_BIRTH], [phone]
И в чем проблема-то?
+ разбиение
declare @table table (name nvarchar(100),dr date, phone nvarchar(100))
insert @table
select 'Ivanov'as[fio], '10.01.1950'as[birth], '4956789'as[phone] union 
select 'Ivanov', '20.11.1976', '123321' union 
select 'Petrov', '23.12.1784', NULL union
select 'Sidorov', '26.12.1888', '7657875' union
select 'Sidorov', '12.04.1756', NULL

SELECT * FROM @table

-- для разделения однофамильцев по DR
DECLARE @fiodr TABLE (id int identity primary key, name nvarchar(100), dr date, unique(name,dr))
insert @fiodr SELECT /*DISTINCT*/ t.name,t.dr FROM @table t order by t.dr,t.name

CREATE TABLE fio (id int identity primary key, name nvarchar(100))
set identity_insert fio ON
insert fio(id,name) SELECT id,name FROM @fiodr
set identity_insert fio OFF

CREATE TABLE dr (id int identity primary key, idf int references fio(id), dr date)
insert dr SELECT DISTINCT f.id,t.dr FROM @table t join @fiodr f on f.name=t.name and f.dr=t.dr

CREATE TABLE ph (id int identity primary key, idf int references fio(id), num nvarchar(20))
insert ph SELECT DISTINCT f.id,t.phone FROM @table t join @fiodr f on f.name=t.name and f.dr=t.dr

SELECT * FROM fio
SELECT * FROM dr
SELECT * FROM ph

DROP TABLE dr, ph
DROP TABLE fio
1 фев 13, 22:14    [13864616]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить