Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:不使用游标将数据从一个表复制到另一个表_Sql_Sql Server_Tsql - Fatal编程技术网

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

SQL Server:不使用游标将数据从一个表复制到另一个表,sql,sql-server,tsql,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

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

使用光标将非常容易,因为我必须执行以下操作:

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
UPDATE dt
SET    Value = ot.dataToMigrate
FROM   DestinationTable dt
   JOIN OriginTable ot
       ON dt.Id = ot.Id
WHERE bar <> 'foo'
DECLARE db\u游标
选择Id,dataToMigrate
从原始表
“福”酒吧在哪里
打开db_光标
从db_游标提取下一个到@Id,@DataToMigrate
而@@FETCH\u STATUS=0
开始
更新DestinationTable
设置值=@DataToMigrate
其中Id=@Id
从db_游标提取下一个到@Id,@DataToMigrate
结束
关闭db_光标
取消分配db_游标
然而,这感觉是错误的。我相信一定有一种更简单、更聪明的方法,不用光标就能做到这一点


有人知道更好的方法吗?

是的,光标是完全错误的方法。为寻找更好的方法而自豪。您可以通过一个简单的update语句来实现这一点

update d
set Value = o.DataToMigrate
from DestinationTable d
join OriginTable o on o.SomeColumn = d.SomeColumn
where o.bar <> 'foo'
updated
设置值=o.DataToMigrate
从预定表d
连接o.SomeColumn=d.SomeColumn上的原始表o
o.bar'foo'在哪里

基于集合的解决方案是您的最佳选择。您可以将
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'
updated
设置D.值=O.数据迁移率
从预定表D
内联接原始表
在D.Id=O.Id上
O.bar'foo'在哪里

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

这是从内存中提取的,但看起来是这样的:

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
UPDATE dt
SET    Value = ot.dataToMigrate
FROM   DestinationTable dt
   JOIN OriginTable ot
       ON dt.Id = ot.Id
WHERE bar <> 'foo'
更新dt
设置值=ot.dataToMigrate
来自DestinationTable dt
联接原始表
ON dt.Id=ot.Id
“福”酒吧在哪里

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

使用sub-select不会有帮助吗?where子句REQUIRIEDOPS忘记了这一点这基本上就像做一个选择,然后将数据从结果数据集的一列复制到另一列?