Из одной таблицы в три связанные

NBC
Дата: 01.02.2013 16:32:44
Есть excel с данными. Для примера поля N1, N2, N3, B4, B5, C6, C7
Ключевого поля нет.

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

Вопрос: без курсора реально ???
Jovanny
Дата: 01.02.2013 16:38:26
Курсор тут вообще ни причем.
Если задача единоразовая, то
http://msdn.microsoft.com/ru-ru/library/ms141209%28v=sql.105%29 .
Jovanny
Дата: 01.02.2013 16:39:38
Перелить всё в одну таблицу, а потом разбить.
NBC
Дата: 01.02.2013 17:04:11
Перелить то не проблема, я не совсем понимаю как разбить.


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

- есть строка: 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
Jovanny
Дата: 01.02.2013 17:06:11
Может, что-то типа такого:

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.
NBC
Дата: 01.02.2013 17:35:38
С ключевыми полями не получится, нужно примерно вот что:

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]
Glory
Дата: 01.02.2013 17:38:16
NBC
С ключевыми полями не получится,

Что мешает создать искусственный ключ ?
NBC
Дата: 01.02.2013 17:50:39
Glory
NBC
С ключевыми полями не получится,

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


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

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

Тогда придется в двух таблицах создать еще по одному полю и сохранять туда искуственно сгенерированный ключ ?
Exproment
Дата: 01.02.2013 20:19:08
NBC, если я вас правильно понял, то примерно так:

1) открывается транзакция
2) находится максимальное значение инкремента(далее - num) в серилизуемой(вроде) транзакции - чтоб пока все не вставится, никто не мог вставить новое значение
3) затем ваш набор из экселя нумеруете с помощью num+row_number() over(order by любое поле)
4) отключается identity insert на таблицах источниках
5) вставляете записи(ключи у вас уже есть из пункта 3)
6) закрываете транзакцию
Cygapb-007
Дата: 01.02.2013 22:14:55
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