每个替代方案的T-SQL?

时间:2010-06-08 22:32:15

标签: sql sql-server tsql foreach

我需要从一个表中获取数据并将其导入另一个表。在伪代码中,类似这样:

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不支持For Each..Next,那么我有什么替代方案?

7 个答案:

答案 0 :(得分:9)

如果您使用的是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 )

答案 1 :(得分:7)

在所有条件相同的情况下,基于集合的操作会更好。

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 )

答案 2 :(得分:4)

您可以像其他人描述的那样使用光标。就个人而言,我喜欢连续两个语句:

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)

答案 3 :(得分:4)

在while循环中执行此操作是错误的 根据您的情况,您可以在sql server 2008中使用新的MERGE语句 这是关于如何做的simple example

答案 4 :(得分:4)

如果您使用的是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 ...

答案 5 :(得分:3)

您声明TSQL但不提供版本。如果您使用的是SQL2008,那么Merge语句应该可以满足您的需求。

答案 6 :(得分:0)

最常用的方法之一是使用游标。这样,您可以浏览查询返回的每条记录并相应地处理它,或者使用UPDATE或INSERT。

请参阅:http://msdn.microsoft.com/en-us/library/ms180169.aspx