您好我必须将数据从一个表迁移到另一个表,我想避免使用游标。
使用光标这很容易,因为我必须这样做:
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
然而,这感觉不对。我确信在没有游标的情况下必须有一种更简单,更聪明的方法。
任何人都知道更好的方法吗?
答案 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)
基于集合的解决方案是您的最佳选择。您可以将UPDATE
与JOIN
一起使用。您需要知道这只是更新您的行,而不是插入任何数据。
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'
语法必须完全正确,但是很可能连接两个表并从另一个表更新一个。