Я должен взять данные из одной таблицы и импортировать его в другую таблицу. В псевдокоде, чем-то вроде этого:
For Each row in table1
If row.personid is in table2 then
update table2.row
Else
insert row into table2
End If
Next
Что лучший способ состоит в том, чтобы сделать это в T-SQL? Насколько я понимаю T-SQL не поддерживает Для Каждого.. Затем, поэтому, какие альтернативы я имею?
При прочих равных условиях, операции на основе множеств лучше.
update t1
set t1.x = t2.x
.
.
.
from table1 t1
inner join table2 t2 on t1.id = t2.t1id
then
insert into table1
select * from table2 t2 where t2.t1id not in (select table1.id from table1 )
Вы можете использовать для этого курсор, как описано другими. Лично мне нравится делать два оператора подряд, например:
UPDATE tbl2 SET field1=tbl1.field1, field2=tbl1.field2 -- etc.
FROM tb12
JOIN tbl1 on tbl2.personid = tbl1.personid
INSERT tbl2 (personid, field1, field2)
SELECT personid, field1, field2
FROM tbl1
WHERE NOT EXISTS (select personid from tbl2 where personid = tbl1.persondid)
Если вы используете SQL Server 2008, вы можете использовать оператор MERGE
. Может быть, что-то вроде этого:
MERGE table2 AS t -- target
USING table1 AS s -- source
ON ( t.personid = s.personid )
WHEN MATCHED THEN
UPDATE
SET second_column = s.second_column,
third_column = s.third_column,
etc = s.etc
WHEN NOT MATCHED THEN
INSERT ( personid, second_column, third_column, etc )
VALUES ( s.personid, s.second_column, s.third_column, s.etc )
делать это в цикле while просто неправильно.
для вашей ситуации вы можете использовать новый оператор MERGE в sql server 2008.
Вот простой пример, как это сделать.
Если вы используете SQL Server 2008, то лучший способ сделать это - использовать оператор MERGE
. Что-то вроде ...
MERGE INTO target_table t
USING source_table s
ON t.personid = s.personid
WHEN MATCHED THEN
UPDATE ...
WHEN NOT MATCHED THEN
INSERT ...
Один из наиболее распространенных способов - использовать курсоры. Таким образом вы можете просмотреть каждую запись, возвращаемую вашим запросом, и обработать ее соответствующим образом с помощью UPDATE или INSERT.
Вы указываете TSQL, но не указываете версию. Если вы используете SQL2008, оператор Merge должен сделать то, что вам нужно.