2012-06-13 3 views
2

Мне нужно вставить данные в файл csv во временную таблицу и вставить некоторые данные для соответствующего значения id в другой таблице. Я создал и вставил данные в файл csv. Для всех записей в csv-файле, как я могу выполнить цикл и вставить данные купола для соответствующей записи в другой таблице.Прокрутите временную таблицу и вставьте в другую таблицу

CREATE TABLE #tbcompanies 
(ID INT) 
GO 

BULK 
INSERT #tbcompanies 
FROM 'd:\ids.csv' 
WITH 
(
ROWTERMINATOR = '\n' 
) 

select * from #tbcompanies 

drop table #tbcompanies 
+0

Почему вы думаете, петля нужна? Разве вы не можете просто «INSERT [другая таблица] SELECT ID FROM #tbcompanies AS t/* возможно, некоторые присоединяются к [еще одной таблице]'? –

ответ

6

Предполагая, что обе таблицы имеют столбец ID, вы можете обновить другую таблицу, как:

update ot 
set  col1 = tmp.col1 
.  col2 = tmp.col2 
from @tbcompanies tmp 
join OtherTable ot 
on  ot.ID = tmp.ID 

Если в дополнение к обновлению, вы хотите insert строки, которые не существуют, считают merge statement:

; merge OtherTable as target 
using #tmpcompanies as source 
on  target.id = source.id 
when not matched by target then 
     insert (id, col1, col2) values (source.id, source.col1, source.col2) 
when matched then 
     update set col1 = source.col1, col2 = source.col2; 
+0

Спасибо, мне действительно нужно вставить несколько новых записей. Я обновлю свой сценарий. – Joshua

1

Вам не нужно перебрать что-нибудь, так как вы используете SQL Server 2008 и эта версия поддерживает MERGE стат ление.

Посмотрите here.

Или просто используйте обновление с предложением from и присоединитесь к двум таблицам.

1

Если вам нужна функциональность upsert, я настоятельно рекомендую функцию Merge.

псевдокод

merge TargetTableName target 
    using #tbcompanies tmp on tmp.idfield=target.idfield 
    when matched then update...... 
    when not matched then insert........... 
Смежные вопросы