我是SQL Server的新手,并且正在对我们的事务数据库进行一些清理。但是,要完成最后一步,我需要更新一个数据库的一个表中的一个列,并从另一个数据库的另一个表中的另一个列中更新一个列的值。
我找到了一个SQL更新代码片段,并根据我们自己的需要重新编写了它,但我希望有人在我点击“执行”按钮之前将其重新编写一遍,因为更新将影响成千上万个条目。
以下是两个数据库:
数据库1:Movement
ItemMovementLongDescription (数据类型: text /多达40个字符)数据库2:Item
ItemRecordDescription (数据类型: text /最多20个字符)目标:将Column1从db1设置为来自db2的Colum2值。
下面是代码片段:
update table1
set table1.longdescription = table2.description
from movement..itemmovement as table1
inner join item..itemrecord as table2 on table1.itemcode = table2.itemcode
where table1.longdescription <> table2.description我添加了最后一个" where“行,以防止SQL更新已经与源表匹配的列。
这应该执行得更快,只需更新有垃圾的列。但就目前情况而言,这看上去像要运行吗?最后,这是否是一个简单的过程,使用SQLServer2005Express在我执行之前只备份整个Movement db?如果它搞砸了,就恢复它?
或者,是否有必要将表重新转换为table1和表2?执行如下SQL查询是否有效:
update movement..itemmovement
set itemmovement.longdescription = itemrecord.description
from movement..itemmovement
inner join item..itemrecord on itemmovement.itemcode = itemrecord.itemcode
where itemmovement.longdescription <> itemrecord.description事先非常感谢!
发布于 2015-12-20 18:56:18
您不一定需要别名您的表,但我建议您这样做,以加快打字速度,并减少错误的机会。
update m
set m.longdescription = i.description
from movement..itemmovement as m
inner join item..itemrecord as i on m.itemcode = i.itemcode
where m.longdescription <> i.description在上面的查询中,我缩短了别名,项目移动使用m,项目记录使用i。
当大量的记录要被更新,并且它是否会成功时,请始终在测试数据库中创建一个副本(驻留在测试服务器上),并在那里进行尝试。在这种情况下,最安全的选择之一是首先创建一个新字段,并将其命名为longdescription_text。您可以使用(SSMS)或使用下面的命令来实现它:
use movement;
alter table itemmovement add column longdescription_test varchar(100);这里的语法是alter table itemmovement和add a new column called longdescription_test,数据类型为varchar(100)。如果使用SSMS创建新列,则在后台,SSMS将运行相同的alter语句来创建新列。
然后,您可以执行
update m
set m.longdescription_test = i.description
from movement..itemmovement as m
inner join item..itemrecord as i on m.itemcode = i.itemcode
where m.longdescription <> i.description随机检查longdescription_test中的数据。实际上,通过运行以下命令,您可以更快地进行抽查:
select * from movement..itemmovement
where longdescription <> longdescription_test
and longdescription_test is not null如果longdescription_test中的信息看起来不错,可以将update语句更改为设置m.longdescription = i.description,然后再次运行查询。
在进行更新之前,只需创建项目移动表的副本就更容易了。要复制一份,你只需做:
use movement;
select * into itemmovement_backup from itemmovement;如果更新没有按需要成功,则可以截断项目移动并将数据从itemmovement_backup复制回来。
发布于 2015-12-21 05:33:49
佐德福克斯对此作了很好的解释,我对此表示赞赏。这是下一次很好的参考。在阅读了一些语法示例之后,我足够自信地能够运行我在OP中的第二个SQL更新查询。幸运的是,这里的数据不一定是“活的”,因此即使在工作时间,也不一定会有损坏任何东西的风险。考虑到数据的性质,更新后的数据执行得非常完美,更新了所有345,000条条目!
https://stackoverflow.com/questions/34377876
复制相似问题