首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证大规模SQL更新命令的语法

验证大规模SQL更新命令的语法
EN

Stack Overflow用户
提问于 2015-12-20 04:08:27
回答 2查看 50关注 0票数 0

我是SQL Server的新手,并且正在对我们的事务数据库进行一些清理。但是,要完成最后一步,我需要更新一个数据库的一个表中的一个列,并从另一个数据库的另一个表中的另一个列中更新一个列的值。

我找到了一个SQL更新代码片段,并根据我们自己的需要重新编写了它,但我希望有人在我点击“执行”按钮之前将其重新编写一遍,因为更新将影响成千上万个条目。

以下是两个数据库:

数据库1:Movement

  • 表1:ItemMovement
  • 第1列:LongDescription (数据类型: text /多达40个字符)

数据库2:Item

  • 表2:ItemRecord
  • 第2列:Description (数据类型: text /最多20个字符)

目标:将Column1从db1设置为来自db2的Colum2值。

下面是代码片段:

代码语言:javascript
复制
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查询是否有效:

代码语言:javascript
复制
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

事先非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-20 18:56:18

您不一定需要别名您的表,但我建议您这样做,以加快打字速度,并减少错误的机会。

代码语言:javascript
复制
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)或使用下面的命令来实现它:

代码语言:javascript
复制
use movement;
alter table itemmovement add column longdescription_test varchar(100);

这里的语法是alter table itemmovementadd a new column called longdescription_test,数据类型为varchar(100)。如果使用SSMS创建新列,则在后台,SSMS将运行相同的alter语句来创建新列。

然后,您可以执行

代码语言:javascript
复制
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中的数据。实际上,通过运行以下命令,您可以更快地进行抽查:

代码语言:javascript
复制
select * from movement..itemmovement 
where longdescription <> longdescription_test 
  and longdescription_test is not null

如果longdescription_test中的信息看起来不错,可以将update语句更改为设置m.longdescription = i.description,然后再次运行查询。

在进行更新之前,只需创建项目移动表的副本就更容易了。要复制一份,你只需做:

代码语言:javascript
复制
use movement;
select * into itemmovement_backup from itemmovement;

如果更新没有按需要成功,则可以截断项目移动并将数据从itemmovement_backup复制回来。

票数 0
EN

Stack Overflow用户

发布于 2015-12-21 05:33:49

佐德福克斯对此作了很好的解释,我对此表示赞赏。这是下一次很好的参考。在阅读了一些语法示例之后,我足够自信地能够运行我在OP中的第二个SQL更新查询。幸运的是,这里的数据不一定是“活的”,因此即使在工作时间,也不一定会有损坏任何东西的风险。考虑到数据的性质,更新后的数据执行得非常完美,更新了所有345,000条条目!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34377876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档