SQL Server:不使用游标将数据从表复制到另一个表

时间:2014-10-14 15:06:33

标签: sql sql-server tsql

您好我必须将数据从一个表迁移到另一个表,我想避免使用游标。

使用光标这很容易,因为我必须这样做:

DECLARE db_cursor CURSOR FOR
select Id, dataToMigrate
from OriginTable
where bar <> 'foo'

OPEN db_cursor
FETCH NEXT FROM db_cursor into @Id, @DataToMigrate

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE DestinationTable
    SET Value = @DataToMigrate
    Where Id = @Id

    FETCH NEXT FROM db_cursor into @Id, @DataToMigrate
END

CLOSE db_cursor
DEALLOCATE db_cursor

然而,这感觉不对。我确信在没有游标的情况下必须有一种更简单,更聪明的方法。

任何人都知道更好的方法吗?

3 个答案:

答案 0 :(得分:4)

是的,光标完全是错误的方法。感谢寻找更好的方式。您可以使用简单的更新语句来完成此操作。

update d
set Value = o.DataToMigrate
from DestinationTable d
join OriginTable o on o.SomeColumn = d.SomeColumn
where o.bar <> 'foo'

答案 1 :(得分:4)

基于集合的解决方案是您的最佳选择。您可以将UPDATEJOIN一起使用。您需要知道这只是更新您的行,而不是插入任何数据。

UPDATE D
SET D.Value = O.dataToMigrate
FROM DestinationTable D
INNER JOIN OriginTable O
    ON D.Id = O.Id
WHERE O.bar <> 'foo'

答案 2 :(得分:4)

据我所知,这可以通过UPDATE语句来完成。

这是来自记忆,但它看起来像这样:

UPDATE dt
SET    Value = ot.dataToMigrate
FROM   DestinationTable dt
   JOIN OriginTable ot
       ON dt.Id = ot.Id
WHERE bar <> 'foo'

语法必须完全正确,但是很可能连接两个表并从另一个表更新一个。