我需要从一个表中获取数据并将其导入到另一个表中。在伪代码中,像这样:T-SQL每个选择?
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,那么我有什么替代方案?
我需要从一个表中获取数据并将其导入到另一个表中。在伪代码中,像这样:T-SQL每个选择?
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,那么我有什么替代方案?
所有事情都是平等的,基于集合的操作更好。
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或INSERT。
谢谢。我认为这是一种选择 - 但也读到这是违反最佳做法的。b/c光标在内存管理等方面效果不佳。 – davemackey 2010-06-08 22:39:30
@davemackey您阅读正确。我不能相信有2人为此推荐了游标! – 2010-06-08 22:44:15
不要拍马丁使者。游标是对给出的伪代码的合理回应,并且不知道更多信息,可能是一个完美的解决方案。这取决于它将如何使用,表格大小等。 – 2010-06-08 22:57:14
你可以使用光标这是其他人所描述。就我个人而言,我喜欢这样做两行:
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)
在while循环中这样做是错误的。
对于你的状态,你可以在sql server 2008中使用新的MERGE语句。
以下是关于如何操作的simple example。
你说TSQL但不给版本。如果你在SQL2008上,Merge声明应该做你需要的。
谢谢,对不起,我们使用SQL 2008,但我们的某些数据库正在SQL 2005/2000兼容模式下运行(第三方旧版软件) – davemackey 2010-06-08 22:49:07
它可能仍然有效。你试过了吗?编辑:它说这里支持SQL 2005兼容模式,但在2000年问题上保持沉默! http://msdn.microsoft.com/en-us/library/bb510680.aspx – 2010-06-08 22:51:22
如果您使用的是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 ...
如果您使用的是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每个personid有一行还是可以有同一个人ID有多行? – Cervo 2010-06-23 20:46:22