2014-12-30 4 views
0

У меня есть данные в структуре flatfile, которые мне нужно вставить в две таблицы. Структура:Sql Server Вложенные вставки возможно

ID FName SName DOB Response1 Description1 Response2 Description2 Response3 Description3 
3 Bill John 01/01 Yes   Fault   NULL  NULL   NULL  NULL 
4 Cat Bill 01/01 Yes   FaultX  Emer  FaultYX  Zeber  Nuhgt 

Эти две таблицы, где будут вставлены указанные выше данные:

  1. Лица стол -> ID, FName, SNAME, DOB столик
  2. PersonsRelations -> идентификатор ответа, Описание, где Response1, 2 и т. Д. NOT NULL.

Я начал запрос tsql, но не знаю, как это сделать. Запрос должен читать строку после строки, а foreach - создать новую строку в таблице Персоналии и вставить соответствующие ответы & описания в виде новых строк в таблице PersonRelations. Так, например, для записи с идентификатором = 4 в таблице PersonRelations будет 3 связанных новых строки.

+0

Простой способ состоит в том, чтобы сделать отдельный INSERT для каждой пары Response/Description в TableZ. –

ответ

2

Это должно сделать трюк, вы можете использовать оператор APPLY, чтобы отключить таблицу.

create table #tobeinserted 
(
    ID int, 
    FName varchar(50), 
    SName varchar(50), 
    DOB date, 
    Response1 varchar(50), 
    Description1 varchar(50), 
    Response2 varchar(50), 
    Description2 varchar(50), 
    Response3 varchar(50), 
    Description3 varchar(50) 
); 

create table #persons 
(
    ID int, 
    FName varchar(50), 
    SName varchar(50), 
    DOB date 
); 

create table #personsRelations 
(
    PersonId int, 
    Response varchar(50), 
    Description varchar(50) 
); 

insert into #tobeinserted (ID,FName,SName,DOB,Response1,Description1,Response2,Description2,Response3,Description3) 
    values (3,'Bill','John','20140101','Yes','Fault',NULL,NULL,NULL,NULL), 
      (4,'Cat','Bill','20140101','Yes','FaultX','Emer','FaultYX','Zeber','Nuhgt'); 


insert into #persons (id,fname,sname,dob) 
select id+6000000, fname, sname, dob 
from #tobeinserted 

insert into #personsRelations (PersonId, Response, Description) 
select t.id+6000000, a.response, a.description 
from #tobeinserted t 
cross apply 
(
    values(Response1,Description1),(Response2,Description2),(Response3,Description3) 
) as a(response, description) 
where a.response is not null 

select * from #persons; 
select * from #personsRelations; 

drop table #personsRelations; 
drop table #persons; 
drop table #tobeinserted; 
+0

Привет Структура flatfile уже находится в таблице, так что таблица #tobeinserted уже существует table2 – user2906420

+0

Затем измените '# tobeinserted' на' tableZ' – Hatsjoem

+0

Hatsjoem! «... cross apply (values ​​(...» - это было круто! –

Смежные вопросы